我想给我的Django编码的网站增加一些Ajax-nicness.

在我的Django代码中,我使用django.contrib.auth.decorators中的@login_required修饰符来标记哪个视图需要身份验证.未通过身份验证的用户单击它时的默认行为是将他/她重定向到登录页面,然后传递目标页面.

我在一些网站上看到的,而且真的很喜欢的是,当用户点击一个链接,指向一个仅限于登录用户的地方时,他/她不会被重定向到登录页面,而是会得到一个弹出窗口(通过JavaScript),要求他/她登录或注册.没有重定向部分,所以如果用户认为他/她真的不喜欢这个网站而浪费注册时间,那么他/她就不需要使用"Back"键.

因此,问题是:您将如何管理自动将某些链接标记为"受限"的任务,以便JavaScript可以处理它们的onclick事件并显示"请登录"弹出窗口?

推荐答案

我也面临着同样的问题,和您一样,我也想要一个简单的decorator 来包装Django Ajax视图,以便以与其他视图相同的方式处理身份验证.在我看来很有希望的一种方法是将这样的decorator 与在响应中寻找特定值的JavaScript结合使用.

这是装饰师的第一份修订草案:

from functools import wraps

def ajax_login_required(view_func):
    @wraps(view_func)
    def wrapper(request, *args, **kwargs):
        if request.user.is_authenticated():
            return view_func(request, *args, **kwargs)
        json = simplejson.dumps({ 'not_authenticated': True })
        return HttpResponse(json, mimetype='application/json')
    return wrapper

以下是视图:

@ajax_login_required
def ajax_update_module(request, module_slug, action):
    # Etc ...
    return HttpResponse(json, mimetype='application/json')

下面是JavaScript(JQuery):

$.post('/restricted-url/', data, function(json) {
    if (json.not_authenticated) {
        alert('Not authorized.');  // Or something in a message DIV
        return;
    }
    // Etc ...
});

EDIT:我试着按照建议使用functools.wraps.我实际上没有在工作代码中使用这个decorator ,所以要小心可能的bug.

Django相关问答推荐

如何从Django';S模型中的方法中检索值?

如何在Django中显示多个相关对象

如何创建复杂的查询?| ChartJS 和 Django

在 Django 4.1 中提交表单之前显示数据

有什么方法可以自动设置 Debug True Django application

有谁知道是否可以将您的 Django Heroku 应用程序放到 App Store/Google Play 上?

Django ModelForm提交按钮不起作用

使用 Django 和 South 重命名应用程序

djangorestframework:过滤相关字段

变量为无时默认模板标签输出的Django设置?

Django 模板上的 URL 编码

模型中的外键

Django rest-auth allauth 注册,带有邮箱、名字和姓氏,没有用户名

使用 sqlite 运行 django 测试

单击弹出框会滚动回页面顶部 [Bootstrap 和 Django]

settings.DATABASES 配置不正确使用 django 1.4 执行 syncdb 时出错

django admin 排序外键字段列表

保存前向 ModelForm 对象添加数据

Django 模型(1054,Unknown column in 'field list')

django rest 框架:从序列化程序 validate() 方法设置字段级错误