django 在模型上添加文件字段后,CSRF验证失败

63lcw9qa  于 2023-10-21  发布在  Go
关注(0)|答案(5)|浏览(105)

我有个奇怪的问题
所以我有一个应用程序,我的模型完全正常,直到我添加了一个Filefield。
现在我得到了一个CSRF验证失败的错误,即使我不尝试上传文件并将其留空,它也会给我下面的错误。

这是我的模型:

class Municipality(models.Model):
    activate_date = models.DateField()
    deactivate_date = models.DateField()
    code = models.CharField(max_length=200)
    name = models.CharField(max_length=200)
    alt_name = models.CharField(max_length=200, blank=True, null=True)
    logo = models.FileField( upload_to='Logo/muni', max_length=200, blank=True, null=True)

我的应用程序使用AWS Lambda、S3和其他所需服务在AWS上设置
我的S3存储桶(我的文件应该上传到的位置)是在我的settings.py文件中定义的,其中env变量已在AWS Lambda环境变量中定义

AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME', default=None)

我不明白为什么我的模型不会保存,即使我不包括一个文件。
奇怪的是,当我在本地工作时,它不会给我给予这个错误。而且我可以保存这个模型有或没有上传文件。
其他没有定义Filefield或Imagefield的模型可以完美地在线和本地工作。
为什么我每次尝试添加文件域或图像域时都会出现此错误?

**注意:**我在DjangoAdmin界面工作,而不是自定义表单,所以我认为django会自动添加csrf令牌,如果我是对的?
**编辑:**我注意到我的请求头cookie中的csrf令牌与请求的有效载荷中的不同,这正常吗?
**编辑:**我更新了我的django项目到v4.0,现在错误显示为CSRF token missing
**编辑:**我发现当我在admin中保存一个模型时,其中有一个image/filefield,我的POST数据没有与我的请求一起发送。所以我得到一个错误,CSRF令牌丢失是有道理的。

owfi6suc

owfi6suc1#

在Django中使用models.FileField时,关键点是声明enctype如下:

<form enctype="multipart/form-data" action="" method="post">
  ...
  {% csrf_token %}
  ...
</form>

请参见here

osh3o9ms

osh3o9ms2#

1.尝试清除饼干和刷新
1.检查以确保您的中间件中有django.middleware.csrf.CsrfViewMiddleware
1.检查您是否在https上或者您有CSRF_COOKIE_SECURE=False

fgw7neuy

fgw7neuy3#

首先,您应该通过撤消对模型所做的更改进行检查。如果问题仍然存在,那么您可能在其他地方进行了一些更改。也可以从不同的设备和用户帐户尝试它(即使在清除cookie/硬重新加载后,有时浏览器会出现意外行为)。您也可以从这些链接中尝试答案。(link 1link 2
检查HTML源代码可能会有所帮助。另外,如果你使用的是自定义的django管理表单,请再次检查它们是否需要任何更改。在尝试不同的场景时使用@csrf_exempt可以帮助您理解这个错误是否真的是由于csrf或其他问题造成的。
在Django文档中也可以看到这个。

4ioopgfo

4ioopgfo4#

同样的问题。使用requires_csrf_token和csrf_protect。没有一个对我有用。浏览器在用户会话中启动,上传文件为777 root:root in /home/username。将文件所有者更改为用户,并且所有工作都正常。
因此,在某些情况下,不仅chmod 777,但chown用户名:用户名。

csbfibhn

csbfibhn5#

我也遇到了同样的问题。我的问题是文件权限,我不得不使用sudo chmod 777 file

相关问题