首页 > 解决方案 > Django 阻止直接 url 访问

问题描述

可以说我有

.decs

def unwelcome_user(unwelcome_roles=[]):
        def decorator(view_func):
            def wrapper_func(request, *args, **kwargs):
                if request.user.is_authenticated:
                    for group in request.user.groups.all():
                        if group.name in unwelcome_roles:
                            return redirect('main:unwelcome-user-type', 
                                             user_type=group.name)
                        else:
                            return view_func(request, *args, **kwargs)
                else:
                    return view_func(request, *args, **kwargs)
            return wrapper_func
        return decorator

.url

urlpatterns = [
    path('error-unwelcome/<str:user_type>', views.unwelcome_user, name='success')
]

.views

@unwelcome_user(unwelcome_roles=['xyz'])
def success(request) 
    return render(request, 'success_page.html', {})

def unwelcome_user(request, user_type):
return render(request, 'errors/unwelcome_user.html', {})

我可以通过在浏览器中键入类似 mysite.com/error-unwelcome/xyz 之类的内容直接访问 unwelcome_user 视图,即使不执行应导致显示该页面的后续过程。我该如何防止呢?

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


我还是 Django 的新手,所以我无法尝试给出的 cookie/sessions 答案(我仍然需要学习会话)。与此同时,这就是我正在使用的:

def get_referer(request):
    referer = request.META.get('HTTP_REFERER')
    if not referer:
        return None
    return referer

那么在任何情况下

def my_view(request):
    if not get_referer(request):
        raise Http404
    return render(request, 'sample.html', {})

在这里我假设如果没有引用者,那么这意味着在浏览器中输入 URL 的人。


推荐阅读