Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 你能从请求对象-csrf构造函数异常构造csrf吗?_Python_Django - Fatal编程技术网

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值从我的视图传递到我的模板吗?不,你只需要