【问题标题】:Adding headers to django CBV将标头添加到 django CBV
【发布时间】:2014-09-24 11:54:38
【问题描述】:

我想向 Django CreateView 添加一个X-Frame-Options 标头。我需要这个,因为我将提供一个将在 iframe 标记中加载的表单。

问题是,在 django 基于类的视图中有几个方法返回 HttpResponse 对象。 有没有办法在不覆盖所有这些方法的情况下将标头添加到响应中?

class MyView(CreateView):
    def get(self, request, *args, **kwargs):
        resp = super(MyView, self).get(request, *args, **kwargs)
        resp['X-Frame-Options'] = ''
        return resp
    # Same would go for form_invalid, post, put, etc...

【问题讨论】:

    标签: django http x-frame-options


    【解决方案1】:

    好的,我修好了。如果您遇到过类似的问题,请按照以下步骤操作。 您必须以与上面示例代码中的 get 相同的方式覆盖 render_to_response 方法。

    【讨论】:

      【解决方案2】:

      我尝试了覆盖渲染到响应的方法,但我想要一个可以用于映射到多个视图的整个 url 块的解决方案,而不必处理在多个视图上覆盖相同的方法。

      我基于django-cors-headers 创建了一个中间件类,因此我可以允许对我的 django 应用程序的一部分进行 iframe 处理。我在我的主项目目录中保留了一个 middleware.py 并保存了我在那里创建的几个随机中间件类,比如这里的这个和一个 ForceResponse Exception 例如。

      import re
      from django import http
      from django.conf import settings
      
      class XFrameAllowMiddleware(object):
      
          def process_request(self, request):
              """
              If CORS preflight header, then create an
              empty body response (200 OK) and return it
      
              Django won't bother calling any other request
              view/exception middleware along with the requested view;
              it will call any response middlewares
              """
              if (self.is_enabled(request) and
                      request.method == 'OPTIONS' and
                      "HTTP_ACCESS_CONTROL_REQUEST_METHOD" in request.META):
                  response = http.HttpResponse()
                  return response
              return None
      
          def process_response(self, request, response):
              if self.is_enabled(request):
                  response['X-Frame-Options'] = 'ALLOWALL'
              return response
      
          def is_enabled(self, request):
              return re.match(settings.XFRAME_URLS_REGEX, request.path)
      

      将其添加到您的 MIDDLEWARE_CLASSES 并在您的设置中配置正则表达式:

      MIDDLEWARE_CLASSES = (
          ...
          'your_django_app.middleware.XFrameAllowMiddleware',
          'corsheaders.middleware.CorsMiddleware',
          'django.middleware.common.CommonMiddleware',
          ...
      )
      
      XFRAME_URLS_REGEX = r'^/iframe_this_url/.*$'
      

      来自 django-cors-headers read.me:

      CORS_URLS_REGEX:指定一个 URL 正则表达式,以启用 CORS 标头的发送;当您只想为特定 URL 启用 CORS 时很有用,例如。 G。对于 /api/ 下的 REST API。 示例:

      CORS_URLS_REGEX = r'^/api/.*$'
      

      默认值:

      CORS_URLS_REGEX = '^.*$'
      

      【讨论】:

        猜你喜欢
        • 2015-06-03
        • 2020-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 2016-02-15
        相关资源
        最近更新 更多