python - 在 Django 中重定向给出 302 响应
问题描述
我想要做的是阻止经过身份验证的用户访问注册页面。这就是我写的。
def validate_request(request):
if request.user.is_authenticated and request.user.is_active:
print("Condition approved")
return redirect("home:home")
def signup_view(request):
validate_request(request)
if request.method == "POST":
form = StudentUserSignupForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect("https://google.com"). #TODO: Replace it
else:
redirect("home:home")
else:
print("Got some other method: ", request.method)
form = StudentUserSignupForm()
context = {
"form": form,
}
return render(request, "signup_login_form.html", context=context)
当我测试并创建一个新用户时,它会成功创建并且重定向正常。但是,创建的新用户仍然可以访问注册页面。
我在函数内部的重定向函数调用中添加了一些快速打印语句,validate_request
输出为
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/">
它试图检查的 URL 已经存在并且是正确的。
我将重定向替换为https://google.com
而不是,home:home
它仍然给出了相同的响应。
尝试的第三件事是在signup_view
调用函数后立即重定向。内部重定向和重定向到谷歌的相同响应也失败了。
我一直在这个问题上停留了一段时间。我已经回答了类似问题,但这些似乎对我没有帮助。
更多可能有用的细节
项目结构是
Website
|
'->Website
'->urls.py
'-> ...
'-> ...
'->Users
'-> urls.py
'->Home
'-> urls.py
的内容Website/urls.py
是
urlpatterns = [
path('mdeditor/', include('mdeditor.urls')),
path('admin/', admin.site.urls),
path('', include("Home.urls")),
path('u/', include('Users.urls')),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
的内容Users/urls.py
是
app_name = "students"
urlpatterns = [
path('signup/', signup_view, name="signup"),
path('login/', login_view, name="login"),
]
的内容home/urls.py
是
app_name = "home"
urlpatterns = [
path('', home_view, name="home")
]
Python==3.8.2 Django==3.2.6
我不知道我在这里错过了什么。如果你们能在这里指出我的错误,那将非常有帮助。
解决方案
我本可以在视图本身中检查经过身份验证的用户。但是最好编写一个可以在任何视图中使用的自定义装饰器。如果您想阻止登录用户访问任何视图,则可以使用以下命令。
from django.shortcuts import redirect
from functools import wraps
from django.urls import reverse
def redirect_logged_in_users(func):
@wraps(func)
def wrapper(request,*args,**kwargs):
if request.user.is_authenticated and request.user.is_active:
return redirect(reverse("home:home"))
return func(request, *args, **kwargs)
return wrapper
然后你可以在 sign_up 视图中使用这个自定义装饰器
@redirect_logged_in_users
def sign_up(request):
# function code
推荐阅读
- javascript - ThreeJS:纹理显示在调试中,但不在正常模式下
- javascript - 如何检查 $('.name') 是否包含特定值
- c# - Ajax 传递空值但控制器在 ASP.NET MVC 中为空
- c++ - 什么是适合我的用例的 rest api 框架(c++)?
- python - 预测 Apache Spark(PySpark) 集群大小
- javascript - JavaScript foreach 事件监听器以相同的计数结束
- python - Django DateTimeInput 类型'datetime-local'不保存到数据库
- java - 如何使用 Spring Boot 将 git commit id 输出到所有 logback 日志?
- javascript - ChartJs Scatter with Bars
- c# - 如何在 HttpWebRequest 中获取服务器文件名?