我将如何处理我的网站上的另一个 POST 请求

How would I handle another POST request on my site

提问人:Mirosław Wertel 提问时间:11/14/2023 更新时间:11/14/2023 访问量:83

问:

您好,在我的登录站点中,我有一个表单,可以在提交时发送 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,但我完全迷失了尝试这项工作)

javascript python django django 视图

评论

0赞 markwalker_ 11/14/2023
您应该对 ajax 用户名检查有不同的视图。
0赞 Mess 11/14/2023
在有效负载中设置一些参数来区分两个 post 请求。
0赞 Mirosław Wertel 11/14/2023
@Mess 如何添加参数,然后在我的视图中读取它?
0赞 Bubble 11/14/2023
您希望实时验证错误吗?如果是,请检查此示例

答:

0赞 jwP54 11/14/2023 #1

您需要使用另一条路线。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/

1赞 M Burak 11/14/2023 #2

最常见的方法是对每个 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 框架,作为此类“背景”功能的学习路径。

评论

0赞 Mirosław Wertel 11/14/2023
这会迫使我将用户重定向到 check_username/ url 吗?或者这只是为了让 Django 处理我的请求并在用户停留在表单 URL 上时发回结果?
0赞 M Burak 11/14/2023
@Miros ławWertel 如果选择选项 1,则无需将用户重定向到 check_username/ URL。相反,当用户停留在表单页面上时,此 URL 应由后台的 AJAX 请求命中。
0赞 sajad 11/14/2023 #3

如果您需要知道用户名是否已被占用,您可以简单地使用表单的覆盖干净方法进行操作:

    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

0赞 Mess 11/14/2023 #4

您只需在有效负载中设置其他参数即可区分发布请求。

例如,在 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 调用中也包含它。然后,您可以在视图中实现任何其他条件。signupnormal