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

hts6caw3  于 12个月前  发布在  Java
关注(0)|答案(4)|浏览(104)

你好,在我的登录网站我有一个表单,在提交时发送一个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,我完全迷失了方向。)

ax6ht2ek

ax6ht2ek1#

您需要使用另一个路由。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、POST)不同,但在一个端点上不会处理两次。
我认为Flask是一个更好的地方来开始这些概念。

flvlnr44

flvlnr442#

最常见的方法是为每个POST请求使用不同的URL路径。这意味着有一个URL用于注册表单提交,另一个URL用于用户名可用性检查。(我建议使用开发人员工具->网络选项卡检查类似的Web应用程序行为,当他们做类似的事情时)
最佳实践和推荐方法:为username_check使用不同的URL:
在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 Framework,作为这类“背景”功能的学习路径。

ulydmbyx

ulydmbyx3#

如果你需要知道一个用户名是否已经被使用,你可以简单地用你的表单的overriding clean方法来做:

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放在你的模型字段中。

nzrxty8p

nzrxty8p4#

您可以简单地在负载中设置额外的参数来区分post请求。
例如,在您的views.py中,您可以设置一个附加参数signup作为您的有效负载的一部分:

if request.method == "POST":
    signup = request.POST.get('signup', 'normal'):
    if signup == 'normal':
       # implement normal signup logic..
    else:
       # implement custom logic

字符串
在你的模板中,确保添加signup作为表单的一个属性,在本例中默认值为normal。在你对视图进行的任何JavaScript post调用中也包括它。然后你可以在你的视图中实现任何其他if条件。

相关问题