【问题标题】:CSRF verification failed after adding a filefield on model在模型上添加文件字段后 CSRF 验证失败
【发布时间】:2022-01-17 20:57:29
【问题描述】:

我遇到了一个奇怪的问题。
所以我有一个应用程序,我的模型在我添加 Filefield 之前完全没问题。

现在我收到一个 CSRF-Verification failed 错误,即使我不尝试上传文件并将其留空,它也会给我以下错误。

这是我的模型:

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

编辑:我发现当我在管理员中保存一个包含图像/文件字段的模型时,我的 POST 数据不会随我的请求一起发送。因此,我得到一个错误,CSRF 令牌丢失是有道理的。

【问题讨论】:

    标签: django aws-serverless


    【解决方案1】:

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

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

    here

    【讨论】:

    • mb,我应该说我正在使用 DjangoAdmin 界面。不是自定义表格。所以我认为 DjangoAdmin 会自动执行此操作?
    • 不知道,你可以在浏览器中查看html源码。
    【解决方案2】:
    1. 尝试清除 cookie 并刷新
    2. 检查以确保您有 django.middleware.csrf.CsrfViewMiddleware 在你的 middleware
    3. 检查您是否在 https 上或者您有 CSRF_COOKIE_SECURE=False

    【讨论】:

    • 感谢您的回复,遗憾的是我尝试了所有这些方法都没有成功
    【解决方案3】:

    首先,您应该通过撤消对模型所做的更改来进行检查。如果问题仍然存在,那么您可能在其他地方进行了一些更改。也可以从不同的设备和用户帐户尝试它(即使在清除 cookie/硬重新加载后,某些浏览器也会出现意外行为)。 您也可以从这些链接中尝试答案。(link 1, link 2)

    检查 html 源代码可能会有所帮助。 此外,如果您使用自定义 django 管理表单,请再次检查它们是否需要任何更改。在尝试不同的场景时使用@csrf_exempt 可能会帮助您了解这个错误是否真的是因为 csrf 或者还有其他问题。

    在 django docs 中也可以看到这个。

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2012-01-14
      • 2015-08-26
      • 2014-01-09
      • 2023-03-09
      • 2012-09-08
      • 2015-06-02
      • 1970-01-01
      相关资源
      最近更新 更多