python - Django 网址验证

标签 python django

你好,

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

感谢大家。

最佳答案

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

在 View 中检查请求类型非常简单——只需检查 request.method 是否等于 "GET""POST"

如果您经常这样做,一个捷径是创建一个装饰器来为您执行此检查。例如,以下装饰器检查 GET 请求是否用于调用此 View ,或者返回一个 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

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

@require_GET
def your_view(request):
    # ...

您可以对 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

像这样使用:

@require_POST
def another_view(request):
    # ...

或:

@require_POST(required_fields=("username", "password"))
def custom_login_view(request):
    # ...

更新

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

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

关于python - Django 网址验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6228102/

相关文章:

python - 使用 pywinauto 确认 PuTTY 主机 key 提示

python - 复制带有 Telethon 的帖子链接

python - Django 管理员反向排序

python - Django - 什么是最佳实践 - 计算字段值

python - 如果路由以 'post/' 开头,Django 与 CreateView 不匹配

python - Django LazyUser 代码如何工作?

python - 避免在 Django 应用程序中导入循环模型

Python:打印所有命名元组

python - Django - 异常处理最佳实践和发送自定义错误消息

python - 从 Django 表单获取数据并在控制台打印