Django url 验证

Sha*_*shi 3 python django

你好,

我想验证我的 url,无论它们是发布还是关心正确的数据。所以我想在它们调用各自的视图之前验证这些 url。所以我愿意在视图和 url 之间编写某种中间件,以便我可以保证系统的安全。我不知道如何通过中间件代码将数据传递给视图。在中间件中,我将编写单元测试代码。如果有效,它将验证网址,然后将传递给相应的视图,否则很高兴说 404 。所以任何朋友都可以建议我如何处理这个案例。或者他们可能是另一种进行这种验证的最佳方法。

谢谢大家。

Sha*_*hin 5

您确实应该在视图中检查请求类型,而不是在中间件中。正如我在上面的评论中提到的,您无法仅从 URL 判断请求是否是 POST 消息,更不用说确定它携带的 POST 数据了。

检查视图中的请求类型非常简单——简单的检查request.method等于"GET""POST"

如果你经常这样做,一个捷径是创建一个装饰器来为你做这个检查。例如,以下装饰器检查 GET 请求是否用于调用此视图,否则返回一个HttpResponseBadRequest对象(状态代码 400):

# untested code, use with care
def require_GET(view_func):
    def wrap(request, *args, **kwargs):
        if request.method != "GET":
            return HttpResponseBadRequest("Expecting GET request")
        return view_func(request, *args, **kwargs)
    wrap.__doc__ = view_func.__doc__
    wrap.__dict__ = view_func.__dict__
    wrap.__name__ = view_func.__name__
    return wrap
Run Code Online (Sandbox Code Playgroud)

然后,您可以简单地在您的视图函数前面加上,@require_GET并且无论何时调用视图都会进行检查。例如

@require_GET
def your_view(request):
    # ...
Run Code Online (Sandbox Code Playgroud)

您可以对 POST 执行相同的操作。

这是检查 POST 请求的装饰器示例,它采用必须随 POST 请求一起提供的可选字段列表。

# again, untested so use with care.
def require_POST(view_func, required_fields=None):
    def wrap(request, *args, **kwargs):
        if request.method != "POST":
            return HttpResponseBadRequest("Expecting POST request")
        if required_fields:
            for f in required_fields:
                if f not in request.POST:
                    return HttpResponseBadRequest("Expecting field %s" % f)
        return view_func(request, *args, **kwargs)
    wrap.__doc__ = view_func.__doc__
    wrap.__dict__ = view_func.__dict__
    wrap.__name__ = view_func.__name__
    return wrap
Run Code Online (Sandbox Code Playgroud)

像这样使用:

@require_POST
def another_view(request):
    # ...
Run Code Online (Sandbox Code Playgroud)

或者:

@require_POST(required_fields=("username", "password"))
def custom_login_view(request):
    # ...
Run Code Online (Sandbox Code Playgroud)

更新

好吧,我的错。我刚刚重新发明了轮子。

Django 已经提供了@require_GET@require_POST装饰器。见django.views.decorators.http