Python 你能从请求对象-csrf构造函数异常构造csrf吗?
下面是一个用户注册的示例,我的代码如下所示Python 你能从请求对象-csrf构造函数异常构造csrf吗?,python,django,Python,Django,下面是一个用户注册的示例,我的代码如下所示 from django.views.decorators import csrf def register_user(request): args={} args.update(csrf(request)) #---->Crashes here args["form"] = UserCreationForm() return render_to_response("register.html",args) 我在
from django.views.decorators import csrf
def register_user(request):
args={}
args.update(csrf(request)) #---->Crashes here
args["form"] = UserCreationForm()
return render_to_response("register.html",args)
我在声明中得到一个例外
args.update(csrf(request))
声明
module object is not callable.
关于我可能做错了什么有什么建议吗?快速的谷歌搜索表明,csrf装饰器的正确导入是
from django.views.decorators.csrf import csrf_protect
我的猜测是(我没有django可供测试)您正在导入其他东西,尽管它可能是一个不可调用的模块:)一个快速的google显示csrf装饰器的正确导入是
from django.views.decorators.csrf import csrf_protect
我猜测(我没有django可供测试)您正在导入其他内容,尽管它可能是一个不可调用的模块:)有两种方法可以保护您的django网站: 1-使用中间件,最简单的方法是:
django.middleware.csrf.CsrfViewMiddleware
自动将csrf令牌添加到上下文中
默认情况下,此中间件在settings.py
文件中启用,您可以在模板中直接使用此令牌
使用此解决方案,除了使用模板中的{%csrf\u token%}标记(如下所示)之外,您无需做任何事情。
2-使用csrf\u protect
装饰器:
如果您停用中间件(不推荐使用),您仍然可以使用csrf\u protect
decorator(这似乎是您正在尝试的解决方案,但并非如Danielle所指出的正确导入)
但你的问题似乎是你没有按你应该的方式使用它
它是一个装饰器,即返回作为参数传递的函数的修改版本的函数。在这里,您将向其传递一个请求对象
使用Python时,可以通过以下方式使用装饰器:
@decorator
def function([...]):
[...]
因此,您的视图应该如下所示:
@csrf_token
def your_view(request, *args, **kwargs):
# Your view code
使用{%csrf\u令牌%}
标记:
使用其中一种解决方案后,您可以直接在模板中使用{%csrf_token%}
标记,因为在模板呈现时,csrf标记应该位于您的上下文中(这要归功于中间件或csrf_protect
装饰器):
{%csrf_令牌%}
{{form.as_p}}
以下是关于Django的CSRF保护的更多信息:
下面是有关Python装饰器的更多信息:
有两种方法可以保护您的django网站: 1-使用中间件,最简单的方法是:
django.middleware.csrf.CsrfViewMiddleware
自动将csrf令牌添加到上下文中
默认情况下,此中间件在settings.py
文件中启用,您可以在模板中直接使用此令牌
使用此解决方案,除了使用模板中的{%csrf\u token%}标记(如下所示)之外,您无需做任何事情。
2-使用csrf\u protect
装饰器:
如果您停用中间件(不推荐使用),您仍然可以使用csrf\u protect
decorator(这似乎是您正在尝试的解决方案,但并非如Danielle所指出的正确导入)
但你的问题似乎是你没有按你应该的方式使用它
它是一个装饰器,即返回作为参数传递的函数的修改版本的函数。在这里,您将向其传递一个请求对象
使用Python时,可以通过以下方式使用装饰器:
@decorator
def function([...]):
[...]
因此,您的视图应该如下所示:
@csrf_token
def your_view(request, *args, **kwargs):
# Your view code
使用{%csrf\u令牌%}
标记:
使用其中一种解决方案后,您可以直接在模板中使用{%csrf_token%}
标记,因为在模板呈现时,csrf标记应该位于您的上下文中(这要归功于中间件或csrf_protect
装饰器):
{%csrf_令牌%}
{{form.as_p}}
以下是关于Django的CSRF保护的更多信息:
下面是有关Python装饰器的更多信息:
从代码判断,您需要的是
django.template.context\u processors.csrf()
,而不是django.views.decorators.csrf
。这将csrf令牌置于模板上下文中
建议使用render
而不是render\u to\u response
。这将运行所有已配置的,包括csrf
上下文处理器
from django.shortcuts import render
def register_user(request):
args = {}
args["form"] = UserCreationForm()
return render(request, "register.html", args)
这就是允许您在模板中使用{%csrf\u token%}
模板标记的原因
您仍然需要使用
CsrfViewMiddleware
(推荐)或csrf\u protect
装饰器来实际保护您的视图 从代码判断,您需要的是django.template.context\u processors.csrf()
,而不是django.views.decorators.csrf
。这将csrf令牌置于模板上下文中
建议使用render
而不是render\u to\u response
。这将运行所有已配置的,包括csrf
上下文处理器
from django.shortcuts import render
def register_user(request):
args = {}
args["form"] = UserCreationForm()
return render(request, "register.html", args)
这就是允许您在模板中使用{%csrf\u token%}
模板标记的原因
您仍然需要使用
CsrfViewMiddleware
(推荐)或csrf\u protect
装饰器来实际保护您的视图 我认为您使用的装饰器不正确-查看此处的文档以获取示例:我认为您使用的装饰器不正确-查看此处的文档以获取示例:我是否需要将CSRF值从视图传递到模板?不,您只需要django.middleware.CSRF.CsrfViewMiddleware
中间件(默认启用),@詹姆斯佛朗哥把它缩短。你可以用装饰师。但是您可以直接在模板中使用此标记,而无需在视图中添加任何内容(假设您没有从设置.py
中删除中间件)。看起来您确实需要在视图中创建csrf令牌。否则,您将从模板中获得帖子上的无效csrf令牌@Knbk回答了这个问题。我需要将CSRF值从我的视图传递到我的模板吗?不,你只需要