我正在为超级用户创建一种方式来控制另一个用户的帐户,但允许日志记录显示此时执行的所有操作都是由超级用户完成的。
我目前的想法是在中间件中处理请求并查找特定的标头。如果该标头存在,我将用标头中指定的用户替换当前的 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 中启用文本压缩。的性能的文档引用的GZip中间件作为文本压缩当前的解决方案。但是,它带有一个严厉的警告:
GZip中间件
压缩所有现代浏览器的响应,节省带宽和传输时间。请注意,GZipMiddleware 目前被认为是一种安全风险,并且容易受到使 TLS/SSL 提供的保护无效的攻击。有关更多信息,请参阅 GZipMiddleware 中的警告。
几个问题:
POST并且启用了 CSRF 中间件,我是否安全?再次,通过文档:
Django 1.10 中的更改:在旧版本中,Django 的 CSRF 保护机制在使用压缩时容易受到 BREACH 攻击。情况不再如此,但您仍应注意不要以这种方式泄露您自己的秘密。
使用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对象,但我似乎无法拉出它的组成部分来测试消息内容.任何帮助将非常感激!
我正在开发一个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同样的问题.
我有一个想法,这可能与编写中间件或可能是一个基于类的自定义视图有关,我都没有任何经验,所以我想我会向宇宙提出一些问题寻求帮助.
谢谢你的帮助!
我有一个中间件来为每个传入请求进行一些计算/检查.一些视图需要此计算结果.
由于我不想两次调用相同的代码,我想在中间件中将结果放到HttpRequest中,因此视图将能够读取它.
你能用正确的提示帮我,我怎样才能在HttpRequest中添加一个对象?
谢谢
如何在测试期间禁用特定的中间件(我编写的自定义中间件)?
我想使用自定义 Django 中间件 (Django 1.9) 来检查匿名用户是否已接受网站的条款和条件 - 如果用户尚未单击“同意”,我将向他们显示一个对话框。
\n\n我不需要将其存储在数据库中,而是更愿意简单地使用 Cookie。我有以下内容settings.py:
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'\nRun Code Online (Sandbox Code Playgroud)\n\n然后我在TermsMiddleware中尝试一些非常基本的东西 - 在这里我故意尝试修改请求和响应只是为了让它工作:
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n\n如果我检查浏览器中的响应,我会发现它myCookieKey没有被设置,所以我认为我误解了应该如何编写。
我可以像这样在中间件中操作会话,让它在 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,并返回结果。 …
当我在自定义中间件类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) 当请求包含“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
在我们的项目中,我们使用 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) django ×10
python ×5
decorator ×1
django-urls ×1
httprequest ×1
python-3.x ×1
security ×1
session ×1
unit-testing ×1