我正在尝试让OPTIONS请求与django一起工作,但我目前只得到405。我在这里得到的答案是服务器不处理OPTIONS请求。
这是处理请求的视图:
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的开发工具捕获的网络日志
- 请求URL:
http://localhost
- 请求方法:选项
- 状态代码:405方法不允许
请求标头
- 接受:/
- 接受编码:gzip、deflate、sdch
- 接受语言:de,en-US;q=0.8,en;q=0.6
- 访问控制请求标头:接受、来源、内容类型
- 访问控制请求方法: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
响应标头
- 访问控制允许凭据:true
- 访问控制允许标头:内容类型、Pragma、缓存控制
- 访问控制允许方法:POST、GET、OPTIONS、PUT、DELETE
- 访问控制允许来源:
http://localhost
- 允许:发布、获取、选项、放置、删除
- 内容类型:text.html;charset=utf-8
- 日期:2013年8月9日星期五09:39:41 GMT
- 服务器:WSGIServer/0.1 Python/2.7.4
那么我该如何让django服务器来处理它呢?
我怀疑OPTIONS
请求返回405错误,因为您的视图类中尚未定义options
处理程序。请注意,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视图中处理的默认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
要创建有效的飞行前检查,您可以设置自己的CORS Anywhere服务器,或者使用像Just CORS这样的托管服务器作为添加了CORS头的反向道具。