我想在我的django项目中创建一个auth模块.但是,当我打开我的网站url时,我有一个错误:'WSGIRequest'对象没有属性'user'
我试图找到有关此问题的信息,有人说问题出在MIDDLEWARE_CLASSES中,但我无法理解.
这是我的MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
Run Code Online (Sandbox Code Playgroud)
MyProject的/ admin.py
from django.contrib import admin
from personal_area.models import UserProfile
admin.site.register(UserProfile)
Run Code Online (Sandbox Code Playgroud)
MyProject的/ forms.py
from personal_area.models import UserProfile
from django.contrib.auth.models import User
from django import forms
class UserForm(forms.Model):
password = forms.CharField(widget=forms.PasswordInput())
class Meta:
model = User
fields = ('username', 'email', 'password')
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('website', 'picture')
Run Code Online (Sandbox Code Playgroud)
MyProject的/ models.py
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User) …Run Code Online (Sandbox Code Playgroud) 假设我有一个观点:
def pony_view(request, arg1, arg2):
... Make ponies, etc ...
Run Code Online (Sandbox Code Playgroud)
和中间件:
class MyMiddleware(object):
def process_request(request):
# How do I access arg1, arg2 here?
Run Code Online (Sandbox Code Playgroud)
当然arg1和arg2将通过URL params与urls.py传递.
我需要这样做的原因是因为我想在view函数运行之前向request.session添加一些东西(虽然我需要从URL中获取).
我可以在中间件中获取当前会话或cookie吗?
我试过但是我得到了:
'WSGIRequest' object has no attribute 'session'
Run Code Online (Sandbox Code Playgroud) 我正在尝试在注册后立即重定向用户以转到协议条款页面。
这是我的中间件课程:
class TermsMiddleware(object):
def process_request(self, request):
if request.user.profile.filled_terms is None:
return redirect(reverse('terms'))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,可以快速浏览一下我的服务器:
This webpage has a redirect loop
Run Code Online (Sandbox Code Playgroud)
我有一个带有fill_terms字段的Profile模型类。
我有一个术语模板,当我手动访问它时,它工作得很好。
这也是我的网址匹配器:
url(r'^terms/', 'hana.views.terms', name='terms')
Run Code Online (Sandbox Code Playgroud)
我如何摆脱这种重定向循环,并使用中间件将注册用户重定向到协议条款页面?
我想创建一个非常简单的中间件,只需在每个请求上打印"OK".问题是它会引发错误:
Traceback (most recent call last):
File "c:\python27\Lib\wsgiref\handlers.py", line 85, in run
self.result = application(self.environ, self.start_response)
File "C:\Users\Milano\Desktop\Projekty\venvs\sfl_venv\lib\site-packages\django\contrib\staticfiles\handlers.py", line 63, in __call__
return self.application(environ, start_response)
File "C:\Users\Milano\Desktop\Projekty\venvs\sfl_venv\lib\site-packages\django\core\handlers\wsgi.py", line 170, in __call__
self.load_middleware()
File "C:\Users\Milano\Desktop\Projekty\venvs\sfl_venv\lib\site-packages\django\core\handlers\base.py", line 52, in load_middleware
mw_instance = mw_class()
TypeError: __init__() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
中间件类在 project/project/middleware.py
middleware.py
class UserHasProfileMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
print 'OK'
return response
Run Code Online (Sandbox Code Playgroud)
SETTINGS.PY
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', …Run Code Online (Sandbox Code Playgroud) 我有一个检查用户配置文件的中间件.如果auth用户没有配置文件,则重定向到用户配置文件.我的浏览器显示错误The page isn’t redirecting properly.
class Check(MiddlewareMixin):
def process_request(self, request):
if request.user.is_authenticated():
user = request.user
try:
profile = Profile.objects.get(user_id = user)
if profile:
pass
except ObjectDoesNotExist:
return HttpResponseRedirect('/accounts/profile/')
Run Code Online (Sandbox Code Playgroud)
我用了django-allauth.
在我的 Django 应用程序中,白噪声通过以下方式起作用:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleWare',
Run Code Online (Sandbox Code Playgroud)
和
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
Run Code Online (Sandbox Code Playgroud)
我正在将 django 应用程序部署到 heroku。我收到以下错误。白噪声安装成功。
[2018-03-27 01:38:12 +0000] [9] [ERROR] Exception in worker process
ImportError: Module "whitenoise.middleware" does not define a "WhiteNoiseMiddleWare" attribute/class
Run Code Online (Sandbox Code Playgroud)
下面是我的堆栈跟踪。我包含了完整的堆栈跟踪,以便可以了解完整的情况。事实上,我不确定现在发生了什么,而且相当令人沮丧。Heroku 整天都在和我战斗。
File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/arbiter.py", line 244, in handle_chld
2018-03-27T01:38:04.953208+00:00 app[web.1]: self.reap_workers()
2018-03-27T01:38:04.953232+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/arbiter.py", line 524, in reap_workers
2018-03-27T01:38:04.953390+00:00 app[web.1]: raise HaltServer(reason, self.WORKER_BOOT_ERROR)
2018-03-27T01:38:04.953555+00:00 app[web.1]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
2018-03-27T01:38:05.121702+00:00 heroku[web.1]: State changed from starting to crashed
2018-03-27T01:38:05.123683+00:00 heroku[web.1]: State changed from …Run Code Online (Sandbox Code Playgroud) 我正在使用Django JWT启动项目中的身份验证系统。另外,我有一个中间件,问题是在内部,该用户由于某种原因是匿名的,而在该视图中,我可以通过访问该正确的用户request.user。这个问题使我发疯,因为前一段时间该代码运行良好!这是JWT的错误,还是我做错了什么?
class TimezoneMiddleware(MiddlewareMixin):
def process_request(self, request):
# request.user is ANONYMOUS HERE !!!!
if not request.user.is_anonymous:
tzname = UserProfile.objects.get(user = request.user).tz_name
if tzname:
timezone.activate(pytz.timezone(tzname))
Run Code Online (Sandbox Code Playgroud)
相关的settings.py模块:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_RENDERER_CLASSES': (
'djangorestframework_camel_case.render.CamelCaseJSONRenderer',
# Any other renders
),
'DEFAULT_PARSER_CLASSES': (
'djangorestframework_camel_case.parser.CamelCaseJSONParser',
# Any other parsers
),
}
JWT_AUTH = {
'JWT_ENCODE_HANDLER':
'rest_framework_jwt.utils.jwt_encode_handler',
'JWT_DECODE_HANDLER':
'rest_framework_jwt.utils.jwt_decode_handler',
'JWT_PAYLOAD_HANDLER':
'rest_framework_jwt.utils.jwt_payload_handler',
'JWT_PAYLOAD_GET_USER_ID_HANDLER':
'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
'JWT_RESPONSE_PAYLOAD_HANDLER': 'rest_framework_jwt.utils.jwt_response_payload_handler',
# 'rest_authentication.views.jwt_response_payload_handler',
'JWT_SECRET_KEY': SECRET_KEY,
'JWT_PUBLIC_KEY': None,
'JWT_PRIVATE_KEY': None,
'JWT_ALGORITHM': 'HS256', …Run Code Online (Sandbox Code Playgroud) 我使用带有 rest_auth (/login, /logout/, /register...) 的 Django Rest Framework 我有一个中间件,通常由 user_logged_in 或 user_logged_out 信号触发。
在我的中间件中,我想使用 Rest 框架中的 Response 对象。
我的中间件.py
from django.contrib.sessions.models import Session
from django.contrib.auth import logout
from django.contrib.auth.models import AnonymousUser
from rest_framework.response import Response
from rest_framework import status
class OneSessionPerUserMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated:
if request.user.session_key != Session.objects.filter(session_key__in = request.user.session_key):
logout(request)
return Response(request)
return self.get_response(request)
Run Code Online (Sandbox Code Playgroud)
我想我通过了我的条件,但我收到了这个错误:
The response content must be rendered before it can be accessed
Run Code Online (Sandbox Code Playgroud)
如何在中间件中正确使用 API Response 对象? …
我编写了一个简单的 JWT 中间件来从 JWT 获取用户。该方法get_user_from_jwt返回一个 User 对象。
# app.middlewares.py
class JwtMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
self.process_request(request)
return self.get_response(request)
def process_request(self, request):
request.user = self.get_user_from_jwt(request.headers)
def get_user_pk_from_jwt(self, auth_header: str) -> int:
_, token = auth_header.split(' ')
decoded_payload = jwt.decode(token, settings.SECRET_KEY)
user_pk = decoded_payload.get('user_id', None)
return user_pk
def get_user_from_jwt(self, auth_header: str) -> User:
auth_header = headers.get('Authorization', None)
if auth_header:
try:
user_pk = self.get_user_pk_from_jwt(auth_header)
user = get_object_or_404(User, pk=user_pk)
return user
except Exception as error:
logging.error(f'Error decoding …Run Code Online (Sandbox Code Playgroud) django ×8
python ×4
deployment ×1
django-views ×1
heroku ×1
middleware ×1
redirect ×1
whitenoise ×1