我有个奇怪的问题
所以我有一个应用程序,我的模型完全正常,直到我添加了一个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令牌丢失是有道理的。
5条答案
按热度按时间owfi6suc1#
在Django中使用
models.FileField
时,关键点是声明enctype
如下:请参见here。
osh3o9ms2#
1.尝试清除饼干和刷新
1.检查以确保您的中间件中有django.middleware.csrf.CsrfViewMiddleware
1.检查您是否在https上或者您有CSRF_COOKIE_SECURE=False
fgw7neuy3#
首先,您应该通过撤消对模型所做的更改进行检查。如果问题仍然存在,那么您可能在其他地方进行了一些更改。也可以从不同的设备和用户帐户尝试它(即使在清除cookie/硬重新加载后,有时浏览器会出现意外行为)。您也可以从这些链接中尝试答案。(link 1,link 2)
检查HTML源代码可能会有所帮助。另外,如果你使用的是自定义的django管理表单,请再次检查它们是否需要任何更改。在尝试不同的场景时使用
@csrf_exempt
可以帮助您理解这个错误是否真的是由于csrf或其他问题造成的。在Django文档中也可以看到这个。
4ioopgfo4#
同样的问题。使用requires_csrf_token和csrf_protect。没有一个对我有用。浏览器在用户会话中启动,上传文件为777 root:root in /home/username。将文件所有者更改为用户,并且所有工作都正常。
因此,在某些情况下,不仅chmod 777,但chown用户名:用户名。
csbfibhn5#
我也遇到了同样的问题。我的问题是文件权限,我不得不使用
sudo chmod 777 file