提问人:Mirosław Wertel 提问时间:11/14/2023 更新时间:11/14/2023 访问量:83
我将如何处理我的网站上的另一个 POST 请求
How would I handle another POST request on my site
问:
您好,在我的登录站点中,我有一个表单,可以在提交时发送 POST 请求。
这就是我在我的观点中处理表单 POST 请求的方式
def SignUp(request):
if request.method == 'POST':
stuff goes here
else:
form = SignUpForm()
return render(request, "index.html", {"form": form})
现在在我的 javascript 中,我想添加另一个 POST 请求,该请求将检查某个用户名中的当前用户名是否已被占用。我做到了,并将 POST 发送到我当前的视图,其中此 POST 请求将与表单 POST 请求一起处理。 最终发生的事情是 SignUp() 继续处理这两个 POST 请求。 如何在一个视图中处理两个 POST 请求? 有没有更好的方法来完成所有这些工作?(我宁愿留在这个网址上)
试图阅读任何区分 POST 请求的方法,但一无所获。(我几天前才开始学习 Django,但我完全迷失了尝试这项工作)
答:
您需要使用另一条路线。URI 用于为处理功能的终结点创建分层地址。由于您想使用另一个 POST,因此您需要有另一条路由才能让它去。下面是用于数据和用户的 Web API 的路由结构 (restful) 示例。
处理数据操作
- 获取数据或创建新数据
/api/data
- GET
- POST
- 获取一段数据,更新它,删除它
/api/data/:id
-GET
-PUT
-DELETE
处理用户操作
/api/user
-GET
-POST
/api/user/:id
-GET
-PUT
-DELETE
请注意,每个 endoint 都会处理不同的 HTTP 谓词(GET、PUT、POST、DELETE),但绝不会在端点上处理两次。
我认为 Flask 是从其中一些概念开始的更好地方。这是一篇关于 Flask 和路由的博客文章。https://auth0.com/blog/developing-restful-apis-with-python-and-flask/
最常见的方法是对每个 POST 请求使用不同的 URL 路径。这意味着有一个 URL 用于注册表单提交,另一个 URL 用于用户名可用性检查。(我建议使用开发人员工具 -> 网络选项卡检查类似的 Web 应用程序行为,而他们正在做类似的事情)
最佳实践和推荐方法:对以下对象使用不同的 URL:username_check
在 urls.py
from django.urls import path
from .views import SignUp, check_username
urlpatterns = [
path('signup/', SignUp, name='signup'),
path('check_username/', check_username, name='check_username'),
]
在 views.py
def check_username(request):
if request.method == 'POST':
# Handle the username check
...
如果您仍然想在同一个 URL 中执行此操作,这不是最佳实践,但可以通过检查请求来实现。POST 内容。例如,如果用户名检查仅发送用户名,而注册发送其他字段(如电子邮件和密码),则可以执行以下操作:
def SignUp(request):
if request.method == 'POST':
if 'username' in request.POST and 'email' not in request.POST:
# This must be the username check
...
else:
# This must be the sign-up form
...
else:
form = SignUpForm()
return render(request, "index.html", {"form": form})
最后,我建议研究如何实现 API 视图、REST 结构和 Django Rest 框架,作为此类“背景”功能的学习路径。
评论
如果您需要知道用户名是否已被占用,您可以简单地使用表单的覆盖干净方法进行操作:
class SignUpForm(UserCreationForm):
...
def clean_username(self):
username = self.cleaned_data['uesrname']
if User.objects.filter(username=username).exists():
raise ValidationError("Email already exists")
return email
检查此>https://docs.djangoproject.com/en/4.2/ref/forms/validation/
顺便说一句,保持字段唯一性的最好方法是放入模型字段。我希望它有所帮助。unique=True
您只需在有效负载中设置其他参数即可区分发布请求。
例如,在 views.py 中,您可以将附加参数注册设置为有效负载的一部分:
if request.method == "POST":
signup = request.POST.get('signup', 'normal'):
if signup == 'normal':
# implement normal signup logic..
else:
# implement custom logic
在模板中,请确保添加为表单的属性,在本例中为默认值。在对视图进行的任何 javascript post 调用中也包含它。然后,您可以在视图中实现任何其他条件。signup
normal
评论
此示例