标签: django-middleware

有没有办法在django中间件中编辑请求用户?

我正在为超级用户创建一种方式来控制另一个用户的帐户,但允许日志记录显示此时执行的所有操作都是由超级用户完成的。

我目前的想法是在中间件中处理请求并查找特定的标头。如果该标头存在,我将用标头中指定的用户替换当前的 request.user 。目前中间件如下所示:

class ControlledUserMiddleware(MiddlewareMixin):

def process_request(self, request):
    controlled_user = request.META.get('HTTP_CONTROLLED_USER', None)
    if controlled_user:
        request.user = User.objects.get(uuid=controlled_user)
Run Code Online (Sandbox Code Playgroud)

我发现 - 尽管我已将其放在设置文件中的身份验证中间件之后 - 请求中的用户在到达此函数时始终是“匿名用户”。

此方法当前不起作用,我想知道是否可以在 request.user 到达视图逻辑之前对其进行编辑。

根据评论中的要求进行编辑,以下是REST_FRAMEWORK设置:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated'
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.FormParser',
    ]
}
Run Code Online (Sandbox Code Playgroud)

django django-middleware python-3.x django-rest-framework

7
推荐指数
1
解决办法
3380
查看次数

在 Django >= 1.10 中使用 GZip 中间件是否安全?

我希望在 Django 中启用文本压缩。的性能的文档引用的GZip中间件作为文本压缩当前的解决方案。但是,它带有一个严厉的警告:

GZip中间件

压缩所有现代浏览器的响应,节省带宽和传输时间。请注意,GZipMiddleware 目前被认为是一种安全风险,并且容易受到使 TLS/SSL 提供的保护无效的攻击。有关更多信息,请参阅 GZipMiddleware 中的警告。

几个问题:

  • 是否有任何文本压缩的替代品,我可以使用Django的是没有受到安全隐患?
  • 如果我在使用时使用 CSRF 令牌POST并且启用了 CSRF 中间件,我是否安全?

再次,通过文档

Django 1.10 中的更改:在旧版本中,Django 的 CSRF 保护机制在使用压缩时容易受到 BREACH 攻击。情况不再如此,但您仍应注意不要以这种方式泄露您自己的秘密。

security django django-middleware

7
推荐指数
1
解决办法
1386
查看次数

如何在Django单元测试中访问Django消息框架内容

使用Django消息框架,我将消息传递给模板以在各种场景中呈现 - 用户帐户创建成功等.消息存储在会话的cookie中:

print response.cookies['messages']
Set-Cookie: messages="b6870b4797b65640bb535519a5b53808fdc0ea24$[[\"__json_message\"\05420\054\"Account verified\054 you are now logged in\"]]"; Path=/
Run Code Online (Sandbox Code Playgroud)

cookie是一个Morsel对象,但我似乎无法拉出它的组成部分来测试消息内容.任何帮助将非常感激!

python django unit-testing django-middleware django-testing

6
推荐指数
1
解决办法
1932
查看次数

从django视图返回HttpResponse后触发函数

我正在开发一个django网络服务器,另一台机器(具有已知IP)可以将电子表格上传到我的网络服务器.之后的电子表格已经更新,我想触发电子表格上的一些处理/确认/分析(可坐>5分钟---过长其他服务器,以合理的等待响应),然后发送给其他机器(使用已知IP)HttpResponse指示数据处理已完成.

我意识到processing.data()在返回之后你无法做到HttpResponse,但在功能上我希望代码看起来像这样:

# processing.py
def spreadsheet(*args, **kwargs):
    print "[robot voice] processing spreadsheet........."
    views.finished_processing_spreadsheet()

# views.py
def upload_spreadsheet(request):
    print "save the spreadsheet somewhere"
    return HttpResponse("started processing spreadsheet")
    processing.data()

def finished_processing_spreadsheet():
    print "send good news to other server (with known IP)"
Run Code Online (Sandbox Code Playgroud)

我知道如何单独编写每个函数,但是如何processing.data() views.upload_spreadsheet返回响应有效地调用?

我尝试使用django的request_finished信令框架,但这不会processing.spreadsheet()在返回后触发该方法 HttpResponse.我尝试使用装饰器views.upload_spreadsheet同样的问题.

我有一个想法,这可能与编写中间件或可能是一个基于类自定义视图有关,我都没有任何经验,所以我想我会向宇宙提出一些问题寻求帮助.

谢谢你的帮助!

python django decorator django-middleware django-signals

6
推荐指数
1
解决办法
3626
查看次数

Django中间件和HttpRequest发生了变化

我有一个中间件来为每个传入请求进行一些计算/检查.一些视图需要此计算结果.

由于我不想两次调用相同的代码,我想在中间件中将结果放到HttpRequest中,因此视图将能够读取它.

你能用正确的提示帮我,我怎样才能在HttpRequest中添加一个对象?

谢谢

django django-middleware httprequest

6
推荐指数
1
解决办法
1698
查看次数

在测试期间禁用特定的Django中间件

如何在测试期间禁用特定的中间件(我编写的自定义中间件)?

django django-middleware django-testing

6
推荐指数
3
解决办法
2339
查看次数

在 Django 中间件中设置 cookie

我想使用自定义 Django 中间件 (Django 1.9) 来检查匿名用户是否已接受网站的条款和条件 - 如果用户尚未单击“同意”,我将向他们显示一个对话框。

\n\n

我不需要将其存储在数据库中,而是更愿意简单地使用 Cookie。我有以下内容settings.py

\n\n
MIDDLEWARE_CLASSES = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    ...\n    'myapp.middleware.app_custom_middleware.TermsMiddleware',]\n\nSESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我在TermsMiddleware中尝试一些非常基本的东西 - 在这里我故意尝试修改请求响应只是为了让它工作:

\n\n
class TermsMiddleware(object):\n\n    def process_request(self, request):\n        request.session['myCookieKey'] = 'myCookieValue'\n        request.session.save()\n        return\n\n    def process_response(self, request, response):\n        request.session['myCookieKey'] = 'myCookieValue'\n        request.session.save()\n        return response\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我检查浏览器中的响应,我会发现它myCookieKey没有被设置,所以我认为我误解了应该如何编写。

\n\n

我可以像这样在中间件中操作会话,让它在 Django 无论如何要发送的响应中发送的 cookie 中生效吗?该文档听起来我应该能够:

\n\n
\n

它应该返回 None 或 HttpResponse 对象。如果它返回 None,Django 将继续处理该请求,执行任何其他 process_request() 中间件,然后执行 process_view() 中间件,最后执行相应的视图。如果它返回一个 HttpResponse\n 对象,Django 不会\xe2\x80\x99 调用任何其他请求、视图或\n 异常中间件或适当的视图;it\xe2\x80\x99 会将响应中间件应用于该 HttpResponse,并返回结果。 …

python django session django-middleware

6
推荐指数
1
解决办法
2211
查看次数

Django“WSGIRequest”对象没有属性“set_cookie”

当我在自定义中间件类request.set_cookie()中执行此操作时,我不断收到此异常。process_view这是我的 settings.py 中中间件类的顺序:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'website.middleware.UserLastActiveMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',

)
Run Code Online (Sandbox Code Playgroud)

django django-middleware

5
推荐指数
1
解决办法
7277
查看次数

Django:在中间件中用 request.urlconf 覆盖 ROOT_URLCONF

当请求包含“api”子域时,我试图用另一个 url 覆盖 ROOT_URLCONF ,这就是我到目前为止所拥有的。

from django.utils.cache import patch_vary_headers  

class SubdomainMiddleware:
  def process_request(self, request):
    path = request.get_full_path()  
    root_url = path.split('/')[1]
    domain_parts = request.get_host().split('.')

    if (len(domain_parts) > 2):
        subdomain = domain_parts[0]
        if (subdomain.lower() == 'www'):
            subdomain = None
    else:
        subdomain = None

    request.subdomain = subdomain 
    request.domain = domain

    if request.subdomain == "api":
        request.urlconf = "rest_api_example.urls.api"
    else:
        request.urlconf = "rest_api_example.urls.
Run Code Online (Sandbox Code Playgroud)

我也尝试使用 set_urlconf 模块“来自 django.core.urlresolvers”,但它不起作用。我在这里错过了什么吗?

python django django-middleware django-urls django-rest-framework

5
推荐指数
1
解决办法
2601
查看次数

当 PermissionDenied 异常引发时,Django 打印错误

在我们的项目中,我们使用 djangoSessionMiddleware来处理用户会话,并且运行良好。这里唯一的问题是当PermissionDenied异常发生时,错误及其回溯将在控制台中打印出来!然而,正如预期的那样,通过引发该异常,403页面将显示给用户,但我认为这似乎不合理,因为这里的中间件正在处理异常!就像未找到异常一样,我希望控制台中不会出现错误。有什么不对的吗?!

这是中间件设置:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django_otp.middleware.OTPMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'axes.middleware.AxesMiddleware',
]
Run Code Online (Sandbox Code Playgroud)

这是打印的错误:

Forbidden (Permission denied): /the/not_allowed/page
Traceback (most recent call last):
  File "/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3.8/contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "/our_project/base/decorators.py", line 88, in wrapper
    return view_func(request, *args, **kwargs)
  File …
Run Code Online (Sandbox Code Playgroud)

python django django-middleware django-sessions

5
推荐指数
1
解决办法
2740
查看次数