【问题标题】:handle OPTIONS request with django's built in server使用 django 的内置服务器处理 OPTIONS 请求
【发布时间】:2013-08-13 10:13:59
【问题描述】:

我正在尝试使 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
  • Access-Control-Request-Headers:接受、来源、内容类型
  • 访问控制请求方法:PUT
  • 缓存控制:无缓存
  • 连接:保持活动状态
  • 主机 : foo
  • 来源http://localhost
  • Pragma : 无缓存
  • 推荐人http://localhost/bar
  • 用户代理:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36

响应标头

  • 访问控制允许凭据:真
  • Access-Control-Allow-Headers:Content-Type、Pragma、Cache-Control
  • 访问控制允许方法:POST、GET、OPTIONS、PUT、DELETE
  • 访问控制允许来源http://localhost
  • 允许:发布、获取、选项、放置、删除
  • 内容类型 : text/html; charset=utf-8
  • 日期:格林威治标准时间 2013 年 8 月 9 日星期五 09:39:41
  • 服务器:WSGIServer/0.1 Python/2.7.4

那么我怎样才能让 django 服务器来处理呢?

【问题讨论】:

  • 你能发布你的Django视图代码吗?以及发出 OPTIONS 请求的代码?
  • 我已将代码添加到开头的帖子中

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


【解决方案1】:

我怀疑 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

【讨论】:

  • 我已经添加了您描述的选项方法,但它仍然返回 405
  • 没关系。这只是一些论点错误。现在可以了。非常感谢!
【解决方案2】:

要创建有效的预检检查,您可以设置自己的 CORS Anywhere 服务器或使用像 Just CORS 这样的托管服务器作为添加 CORS 标头的反向道具。

【讨论】:

  • 这与 OP 问题不匹配。
猜你喜欢
  • 2020-06-15
  • 2011-06-27
  • 2014-07-24
  • 1970-01-01
  • 2018-01-03
  • 2015-01-02
  • 1970-01-01
  • 2016-07-27
  • 2010-09-18
相关资源
最近更新 更多