gpt4 book ai didi

django - 使用 Django 的内置服务器处理 OPTIONS 请求

转载 作者:行者123 更新时间:2023-12-05 01:21:35 26 4
gpt4 key购买 nike

我正在尝试使 OPTIONS 请求与 django 一起工作,但我目前只收到 405。我得到的答案 here是服务器不处理 OPTIONS 请求。

这是处理请求的 View :

from django.views.generic import View
from piston.utils import coerce_put_post

class TheView(View):

@staticmethod
def find_stuff(params):
...

@staticmethod
def do_stuff(params):
...

@staticmethod
def do_other_stuff(params):
...

@staticmethod
def delete_some_stuff(params):
...

@method_decorator(staff_member_required)
def get(self, request, id):
result = self.find_stuff(id)
return JsonResponse(result)

@method_decorator(staff_member_required)
def post(self, request):
result = self.do_stuff(request.POST)
return JsonResponse(result)

@method_decorator(staff_member_required)
def put(self, request, id):
coerce_put_post(request)
result = self.do_other_stuff(id,request.PUT)
return JsonResponse(result)

@method_decorator(staff_member_required)
def delete(self, request,id):
result = self.delete_some_stuff(id)
return JsonResponse(result)

我正在使用 jQuery 的 $.ajax() 发送请求。这是 chrome 的开发工具捕获的网络日志:

  • 请求网址:http://localhost
  • 请求方法:选项
  • 状态码:405 METHOD NOT ALLOWED

请求 header

  • 接受:/
  • 接受编码 : gzip,deflate,sdch
  • 接受语言 : de,en-US;q=0.8,en;q=0.6
  • Access-Control-Request-Headers : accept, origin, content-type
  • 访问控制请求方法 : PUT
  • 缓存控制 : 无缓存
  • 连接:保持事件状态
  • 主持人 : foo
  • 来源 : http://localhost
  • Pragma : 无缓存
  • 推荐人 : http://localhost/bar
  • 用户代理:Mozilla/5.0(Windows NT 6.2;WOW64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/28.0.1500.95 Safari/537.36

响应 header

  • Access-Control-Allow-Credentials : true
  • Access-Control-Allow-Headers:内容类型、编译指示、缓存控制
  • 访问控制允许方法:POST、GET、OPTIONS、PUT、DELETE
  • 访问控制允许来源 : http://localhost
  • 允许 : post,get,options,put,delete
  • 内容类型:文本/html;字符集=utf-8
  • 日期:2013 年 8 月 9 日星期五 09:39:41 GMT
  • 服务器 : WSGIServer/0.1 Python/2.7.4

那么如何让django服务器来处理呢?

最佳答案

我怀疑 OPTIONS 请求返回 405 错误,因为 options 处理程序尚未在您的 View 类中定义。请注意,Django 不提供默认的 options 处理程序。

这里是负责调用类中适当方法的代码(django 源代码):

# snippet from  django.views.generic.base.View

http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

options 是可以在 Django View 中处理的默认 http 方法之一。如果未定义 options 处理程序,则 dispatch 方法返回 405 错误。


这里是options方法的一个例子

class TheView(View):

self.allowed_methods = ['get', 'post', 'put', 'delete', 'options']
def options(self, request, id):
response = HttpResponse()
response['allow'] = ','.join([self.allowed_methods])
return response

关于django - 使用 Django 的内置服务器处理 OPTIONS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18181261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com