我正在使用Pyres工作人员对用户在表单中输入的数据进行一些处理。它们的处理是通过我的表单上的视图完成的,我向该视图发出POST请求,其中包含数据,包括要处理的数据和用户的CSRF中间件令牌。我的问题是,这显然是不够的,因为Django仍然拒绝了我的请求,并禁止403。
相关代码:
表单处理程序:
def handler(request): if(request.method == "POST"): if(request.POST.__contains__("taskdata")): #valid post of the form taskdata = escape(request.POST.get("taskdata","")) t = TaskData(data=taskdata, time_added=timezone.now(), token=request.POST.get("csrfmiddlewaretoken","")) t.save() r = ResQ(server="127.0.0.1:6379") r.enqueue(TaskData, t.id) return HttpResponse(t.id) else: #invalid post of the form raise Http404 else: raise Http404
比利斯工人工作:
@staticmethod def perform(taskData_id): #Get the taskData from this id, test it for tasky stuff task_data = TaskData.objects.get(pk=taskData_id) post_data = [('id',task_data.id),('data',task_data.data), ('csrfmiddlewaretoken',task_data.token)] # a sequence of two element tuples result = urllib2.urlopen('http://127.0.0.1:8000/tasks/nlp/process/', urllib.urlencode(post_data)) content = result.read() return
该职务发布到的视图:
def process(request): if(request.method == "POST"): return HttpResponse("HEY, it works!") if(request.POST.__contains__("data") and request.POST.__contains__("id")): #valid post to the form by the model #taskdata = escape(request.POST.get("taskdata","")) #data = get_times(taskdata) return HttpResponse("Hey from process!") #return HttpResponse(json.dumps(data)) else: #invalid post of the form raise Http404 else: raise Http404
我基本上要做的是在表单提交时保存一些原始数据,以及CSRF令牌。然后工作人员将该数据令牌发送到处理视图。
不幸的是,发布令牌似乎还不够。
有人知道csrf保护实际上需要什么吗?我如何才能让我的Pyres员工遵守规定?
(建议标签:柴堆)
我想我看到了问题所在。
Django的CSRF保护的工作方式是生成一个nonce,然后将cookie设置为nonce的值,并确保csrfmiddlewaretoken
POST值与cookie的值匹配。其基本原理是它使其成为无状态系统,无需任何持久会话数据即可工作。
问题是你在Pyres工人工作中提出的要求...
result = urllib2.urlopen('http://127.0.0.1:8000/tasks/nlp/process/',
urllib.urlencode(post_data))
…来自服务器,而不是客户端,因此它没有cookie集。
假设URL受到保护,只能由服务器访问,那么使process()
视图免于CSRF检查可能是最简单的…
@csrf_exempt
def process(request):
...
...否则,您必须在< code>handler()视图中手动获取cookie值,并将其传递给Pyres worker作业。
更新
为了确保 process()
方法只能由服务器调用,一种简单的方法是使用类似...
@csrf_exempt
def process(request):
if request.META['REMOTE_ADDR'] != '127.0.0.1':
# Return some error response here.
# 403 is traditional for access denied, but I prefer sending 404
# so 'hackers' can't infer the existence of any 'hidden' URLs
# from the response code
raise Http404
# Now do the thing
....
…尽管可能有一些内置的装饰器或其他东西可以为您完成此操作。
这是我的settings.py: 我已经验证了电子邮件地址,并生成了SMTP凭据,我下载了包含IAM用户名、Smtp用户名、Smtp密码的凭据。我使用smtp用户名EMAIL_HOST_USER和smtp密码EMAIL_HOST_PASSWORD。 在django中,我发送了一封带有以下行的电子邮件(admin@admin.com替换为已验证电子邮件列表中的gmail帐户): 那是行不通的。从SE
在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端。这一过程中使用了django.http.HttpResponse()。 在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中。看似方便,却为我们的管理带来困难。想像一个成熟的网站,其显示格式会有许多重复的地方。如果可以把数据和视图格式分离,就可以重复使用同一视图格式了。 Django中自带的模板系统,
之前在单机上实现了一个Django服务器(被解放的姜戈07 马不停蹄),现在我们可以把这个服务器推上一个云平台。这里我选择使用阿里云。 看着复仇的火焰燃烧,姜戈露出得意的笑容。 阿里云准备 在阿里云官网(aliyun.com)页面注册阿里云账号。登录后选择云服务器ECS,并选择“创建实例”: 选择操作系统Ubuntu 14.04 64位,设置密码。实例开通后,可以在实例记录中查到它的IP地址,我以
前面的文章研究了Django最主要的几个方面:数据库,模板,动态生成页面等。但都是使用python manage.py runserver来运行服务器。这是一个实验性的web服务器,不适用于正常的站点运行。我们需要一个可以稳定而持续的服务器。这个服务器负责监听http端口,将收到的请求交给Django处理,将Django的回复发还给客户端。 这样的持续性服务器可以有很多选择,比如apache, N
之前了解了: 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点,但无法验证用户的身份。我们这次了解用户验证部分。通过用户验证,我们可以根据用户的身份,提供不同的服务。 一个Web应用的用户验证是它的基本组成部分。我们在使用一个应用时,总是从“登录”开始,到“登出”结束。另一方面,用户验证又和网站安全、数据库安全息息相关。HTTP协议是
Django提供一个管理数据库的app,即django.contrib.admin。这是Django最方便的功能之一。通过该app,我们可以直接经由web页面,来管理我们的数据库。这一工具,主要是为网站管理人员使用。 这个app通常已经预装好,你可以在mysite/settings.py中的INSTALLED_APPS看到它。 “这庄园里的事情,都逃不过我的眼睛”,管家放下账本,洋洋得意。 默认界