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

时间:2013-08-12 07:07:01

标签: django http-status-code-405 http-options-method

我试图让OPTIONS请求与django一起工作,但我目前只获得405。 我得到here的答案是服务器不处理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的开发工具捕获的网络日志:

  • 请求网址http://localhost
  • 请求方法:选项
  • 状态代码:405方法不允许

请求标题

  • 接受 /
  • 接受编码:gzip,deflate,sdch
  • 接受语言:de,en-US; q = 0.8,en; q = 0.6
  • 访问控制请求标头:接受,来源,内容类型
  • 访问控制请求方法:PUT
  • 缓存控制:无缓存
  • 连接:keep-alive
  • 主持人:foo
  • 来源http://localhost
  • Pragma :no-cache
  • Referer http://localhost/bar
  • User-Agent :Mozilla / 5.0(Windows NT 6.2; WOW64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 28.0.1500.95 Safari / 537.36

响应标题

  • Access-Control-Allow-Credentials :true
  • Access-Control-Allow-Headers :Content-Type,Pragma,Cache-Control
  • 访问控制 - 允许 - 方法:POST,GET,OPTIONS,PUT,DELETE
  • 访问控制 - 允许 - 来源http://localhost
  • 允许:发布,获取,选项,放置,删除
  • 内容类型:text / html;字符集= UTF-8
  • 日期:星期五,2013年8月9日09:39:41 GMT
  • 服务器:WSGIServer / 0.1 Python / 2.7.4

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

1 个答案:

答案 0 :(得分:4)

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

这是代码(django源代码),它负责在你的类上调用适当的方法:

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

http_method_names = ['get', 'post', 'put', '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