Django框架中Ajax GET与POST请求的实战应用

简介: Django框架中Ajax GET与POST请求的实战应用

前言

    在本博客中,我们将通过登录注册两个实战案例,深入探讨如何在Django项目中使用Ajax进行网络请求以实现数据交互。同时,我们还将详细解析如何利用Cookie和Session来管理用户状态,确保用户信息的安全性和一致性。


一、跨域

跨域问题参考下面这篇文章:

跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护

二、登录

1.前端html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <script src="./js/jquery-2.2.0.min.js"></script>
    <script>
        function fnLogin() {
            var username_label = document.getElementById('username');
            var password_label = document.getElementById('password');
            var user = {
                username: null,
                password: null,
            }
            user.username = username_label.value;
            user.password = password_label.value;
            $.ajax({
                url: "http://127.0.0.1:8000/app/login/",
                type: "POST",
                dataType: "json",
                data: user,
                xhrFields: { withCredentials: true }, //设置支持携带cookie
                success: function (response) {
                    if (response.code == '200') {
                        alert(response.message)
                        window.location.href = 'exd8_news.html';
                    } else {
                        alert(response.message)
                    }
                },
                error: function () {
                    alert("请求失败!")
                }, async: true
            })
        }
    </script>
</head>
<body>
    <input type="text" id="username" placeholder="请输入用户名:"><br>
    <input type="text" id="password" placeholder="请输入密码:"><br>
    <input type="button" value="Login" onclick="fnLogin();">
</body>
</html>

2.后端逻辑

# app/views.py
class LoginView(View):
    def post(self,request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = UserModel.objects.get(username=username)
            if user.password == password:
                request.session['userid'] = user.id #
                print("-------------------")
                print(request.session['userid']) 
                return JsonResponse({"message": "登录成功!", "code": "200"})
            else:
                return JsonResponse({"message": "密码错误!登录失败!", "code": "201"})
        except Exception as e:
            print(e)
            return JsonResponse({"message": "用户不存在!登录失败!", "code": "202"})

三、注册

1.前端html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Register</title>
    <script src="./js/jquery-2.2.0.min.js"></script>
    <script>
        function fnRegister() {
            var username_label = document.getElementById('username');
            var phone_label = document.getElementById('phone');
            var password_label = document.getElementById('password');
            var cpassword_label = document.getElementById('cpassword');
            var user = {
                username: null,
                phone: null,
                password: null,
                cpassword: null,
            }
            user.username = username_label.value;
            user.phone = phone_label.value;
            user.password = password_label.value;
            user.cpassword = cpassword_label.value;
            $.ajax({
                url: "http://127.0.0.1:8000/app/register/",
                type: "POST",
                dataType: "json",
                data: user,
                success: function (response) {
                    if (response.code == '200') {
                        alert(response.message + "跳转到登录页面!")
                        console.log(response);
                        window.location.href = 'login.html';
                    } else {
                        alert(response.message)
                    }
                },
                error: function () {
                    console.log("请求失败!!!");
                }
            })
        }
    </script>
</head>
<body>
    用户名:<input type="text" id="username"><br>
    手机号:<input type="text" id="phone"><br>
    密码:<input type="password" id="password"><br>
    确认密码:<input type="password" id="cpassword"><br>
    <button onclick="fnRegister()">注册</button>
</body>
</html>

2.后端逻辑

# app/views.py
class RegisterView(View):
    def post(self, request):
        # 用户名username,手机号phone,密码password
        # put  delete
        # postman 测试:
        # 1.传参为raw格式时
        # 2.传参为x-www-form-urlencoded时
        print(request.POST)
        print("-------------------")
        print(request.body)
        # -------------------------------------------------
        # 1.传参为raw格式时
        # 字符串转成字典 通过decode解码
        # 使用put  delete时:
        # data = request.body.decode()
        # print("data:" + data)
        # # #***使用raw 传参数时***
        # import json
        # res_dict = json.loads(data)
        # print("username:" + res_dict.get('username'))
        #
        # username = res_dict.get('username')
        # password = res_dict.get('password')
        # phone = res_dict.get('phone')
        # cpassword = res_dict.get('cpassword')
        # -----------------------------------------------------------------
        # 2.传参为x-www-form-urlencoded时
        username = request.POST.get('username')
        password = request.POST.get('password')
        phone = request.POST.get('phone')
        cpassword = request.POST.get('cpassword')
        import re
        if re.match(r'^1[3-9]\d{9}$', phone):
            try:
                UserModel.objects.get(phone__exact=phone)
                return JsonResponse({'message': '用户已存在,请登录'})
            except:
                # 两次密码是否一致
                if password == cpassword:
                    user = UserModel()
                    user.name = username
                    user.password = password
                    user.phone = phone
                    user.save()
                    # 取决于逻辑
                    # request.session['']
                    return JsonResponse({'message': '注册成功'})
                else:
                    return JsonResponse({'message': '两次输入密码不一致'})
        else:
            return JsonResponse({'message': '手机号不满足规则'})

1.使用postman测试POST传参为raw格式时:



控制台输出:

2.使用postman测试POST传参为x-www-form-urlencoded时:



控制台输出:

最后遇到的一个小问题:

使用vscode测试前端页面时使用open in browser和open with live server,可能给会导致不同的结果,详情见下篇文章:VSCode调试揭秘:Live Server助力完美测试Cookie与Session,远超“Open in Browser”!

目录
打赏
0
1
1
0
38
分享
相关文章
AJax(XHR+Get和Post+AJax的封装)
AJax(XHR+Get和Post+AJax的封装)
76 15
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
655 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
509 0
【查漏补缺】Django模型字段类型及其应用
【查漏补缺】Django模型字段类型及其应用
84 0
GitHub OAuth认证的Django应用
GitHub OAuth认证的Django应用
109 0
Django 框架入门全攻略:轻松构建 Web 应用
【5月更文挑战第18天】本文是 Django 入门教程,介绍了如何使用 Django 构建 Web 应用。内容包括安装、项目与应用创建、模型定义、数据库迁移、视图编写、路由配置、模板系统、表单处理和中间件的使用。通过实例展示了 Django 基本流程,帮助初学者快速上手。Django 提供高效工具,便于开发者聚焦业务逻辑,轻松构建功能丰富的 Web 应用。
181 5
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
52 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问