Django-如何拒绝对已登录用户直接访问特定URL

时间:2014-10-17 17:07:53

标签: django django-views django-urls django-sessions

在我的项目中,我们需要某种系统来允许/拒绝对URL的某些访问。

这个例子,我们想要制作某种向导。

用户在第一个屏幕(A屏幕)输入第一个对象,然后按"继续"。 现在我们获取数据并重定向到第二个屏幕(B屏幕),用户应该输入第二个对象。 向导继续...... 问题是,如果我们这样做,用户可以在浏览器中写入B url并访问B屏幕。用户已登录,但即便如此,我们也不希望他在没有通过A屏幕的情况下到达那里。

我们不知道如何实现这一目标或在互联网上寻找这个。我们只知道执行此操作的用户会话。

还有其他方法吗?一些帮助?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为外键是您正在寻找的解决方案使'A'作为'B'的外键并且在'B'的url中将'A'的id作为参数传递为{{1这样,第一个用户将输入“A”中的数据,它将存储在数据库中,然后通过ID“A”访问“B”。阅读有关外键here的更多信息。

答案 1 :(得分:1)

目前,我正在从事数学作业项目。有三种类型的用户。教授,学生和管理员。以下代码段将拒绝用户根据用户访问网址'类型。修改它之后,您必须将此方法装饰器添加到为http请求提供服务的请求方法中。

def deny_a_thing(function):
    def wrapper(request, *args, **kw):
        try:
            test = User.objects.get(username=request.user)   # This will get the username
        except ObjectDoesNotExist:
            raise Http404                                    # return 404, if the user doesn't exist. You can change it to anything
        if not request.user.is_authenticated():              # If the user is not authenticated, return to the rootm. You can also change this.
            return HttpResponseRedirect("/")
        try:
            if test.groups.filter()[0].name != "professors": # Add your test here. E.g: If user saved A, don't go B.
                raise Http404
        except IndexError:
            raise Http404
        else:
            return function(request, *args, **kw)
    return wrapper

将以下内容添加到您的方法

@deny_a_thing                   # This will deny the user from doing the thing you didn't want the user to do.
def some_page_request(request):
    return HttpResponse("OMG")

检查此link以获得更简单的装饰器