Python AWS Elastic BeansTalk Django cronjob post请求返回403错误

Python AWS Elastic BeansTalk Django cronjob post请求返回403错误,python,django,amazon-web-services,cron,amazon-elastic-beanstalk,Python,Django,Amazon Web Services,Cron,Amazon Elastic Beanstalk,我正在开发一个软件功能,在该功能中,我必须使用Django+cron+AWS定期删除文件。问题是我不能让它工作。最好的办法是什么?我是否缺少一些AWS配置?我已经配置了一个web服务器和一个工作者环境,并在其上部署了相同的应用程序版本。任务是映射到url的视图(访问执行该函数的url)。工作环境中有一条确认消息: 已成功从cron.yaml加载1个计划任务 但是工作进程访问日志上也出现403错误: version: 1 cron: - name: "delete_expired_files"

我正在开发一个软件功能,在该功能中,我必须使用Django+cron+AWS定期删除文件。问题是我不能让它工作。最好的办法是什么?我是否缺少一些AWS配置?我已经配置了一个web服务器和一个工作者环境,并在其上部署了相同的应用程序版本。任务是映射到url的视图(访问执行该函数的url)。工作环境中有一条确认消息:

已成功从cron.yaml加载1个计划任务

但是工作进程访问日志上也出现403错误:

version: 1
cron:
 - name: "delete_expired_files"
   url: "/networks_app/delete_expired_files"
   schedule: "10 * * * *"
urlpatterns = [
    url(r'^delete_expired_files', views.delete_expired_files, name='delete_expired_files'),
]
def delete_expired_files(request):
    users = DemoUser.objects.all()
    for user in users:
        documents = Document.objects.filter(owner=user.id)
        if documents:
            for doc in documents:
                now = timezone.now()
                if now >= doc.date_published + timedelta(days=doc.owner.group.valid_time):
                    doc.delete()
“发布/网络应用程序/删除过期文件HTTP/1.1“403 2629”-“aws sqsd/2.0”

cron.yaml

version: 1
cron:
 - name: "delete_expired_files"
   url: "/networks_app/delete_expired_files"
   schedule: "10 * * * *"
urlpatterns = [
    url(r'^delete_expired_files', views.delete_expired_files, name='delete_expired_files'),
]
def delete_expired_files(request):
    users = DemoUser.objects.all()
    for user in users:
        documents = Document.objects.filter(owner=user.id)
        if documents:
            for doc in documents:
                now = timezone.now()
                if now >= doc.date_published + timedelta(days=doc.owner.group.valid_time):
                    doc.delete()
url.py上的url映射:

version: 1
cron:
 - name: "delete_expired_files"
   url: "/networks_app/delete_expired_files"
   schedule: "10 * * * *"
urlpatterns = [
    url(r'^delete_expired_files', views.delete_expired_files, name='delete_expired_files'),
]
def delete_expired_files(request):
    users = DemoUser.objects.all()
    for user in users:
        documents = Document.objects.filter(owner=user.id)
        if documents:
            for doc in documents:
                now = timezone.now()
                if now >= doc.date_published + timedelta(days=doc.owner.group.valid_time):
                    doc.delete()
用于删除视图.py中的文件的函数:

version: 1
cron:
 - name: "delete_expired_files"
   url: "/networks_app/delete_expired_files"
   schedule: "10 * * * *"
urlpatterns = [
    url(r'^delete_expired_files', views.delete_expired_files, name='delete_expired_files'),
]
def delete_expired_files(request):
    users = DemoUser.objects.all()
    for user in users:
        documents = Document.objects.filter(owner=user.id)
        if documents:
            for doc in documents:
                now = timezone.now()
                if now >= doc.date_published + timedelta(days=doc.owner.group.valid_time):
                    doc.delete()
我的IAM角色是:

AmazonSQSFullAccess

AmazonS3FullAccess

AWSELASTICBEAN完全访问

AmazondynamodFullAccess


如果我通过浏览器访问url,则执行任务(删除过期文件)。但是,工作环境应该访问url并自动执行任务,而不仅仅是在我通过浏览器访问url时。我怎样才能让它工作呢?

我也有类似的问题。在我的例子中,我需要修改两件事来让它工作:

  • 确保将视图设置为接受来自AWS的POST操作。以前我将我的设置为GET only,而且AWS似乎不支持GET cron请求

  • 一旦它支持POST,将其设置为CSRF豁免,这样Django就不会担心当AWS发出缺少CSRF令牌的POST请求时会出现CSRF威胁。您可以使用中描述的
    @csrf_-emption
    装饰器;在我的例子中,使用基于类的视图会稍微复杂一些,我发现这是关于如何在基于类的视图中包含
    @csrf\u emption
    装饰器的