4-request对象

前端提交数据

必备知识点

前端form表单中action属性,不写默认是当前路由地址

前端form表单中的method属性,不写默认是GET请求

# views.py
def somthing(request):
    # request是一个对象,封装了用户发送过来的所有请求相关的数据
    # 1.获取请求方式 GET/POST
    print(request.method)
    
    # 2.在URL上传递值 /somthing/?n1=123&n2=345
    print(request.GET)
    
    # 3.在请求中提交数据
    print(request.POST)
    
    # 4.【响应】HttpResponse("返回内容"),内存字符串内容返回给请求者
    # return HttpResponse('返回的内容')
    
    # 5.【响应】读取HTML的内容 + 渲染人(替换) -> 字符串,返回给用户浏览器。
    # return render(request, 'somthing.html', {'title': '来了'})
    
    # 6.【响应】让浏览器重定向到其它的页面,比如你访问了某个博客网站,这个网站肯定会先给你返回一个东西
    # 这个博客网站说我没有,你自己去别的地方吧,然后浏览器向别的地方(重定向的地址)发起的请求
    return redirect("https://www.baidu.com")

前端页面

templates\register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <h1>欢迎登录</h1>
    <form action="" method="post">
        {# 如果不在此处加上下面这段代码,结果会报错 #}
        {% csrf_token %}
        请输入姓名:<input type="text" name="name" placeholder="输入姓名">
        请输入密码:<input type="password" name="password">
        <input type="submit" value="提交">
        <span style="color:tomato">{{ error }}</span>
    </form>
</body>
</html>

后端页面

# views.py
from django.shortcuts import render, redirect

def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')
    # 如果是POST请求,获取用户提交的数据
    username = request.POST.get('name')
    password = request.POST.get('password')
    if username == '小满' and password == '123':
        return redirect("https://www.cnblogs.com/ccsvip")
    
    return render(request, 'register.html', {"error": '用户名或密码错误'})
# views.py
from django.urls import path
from app import views

urlpatterns = [
    path('register/', views.register, name='register')  # name='register' 表示别名
]

如果不加 {% csrf_token %} 就会报错这个错误

image-20240227191526564

解决方案1,注释掉下面这个配置

# 将settings.py文件中的配置注释掉,在后面的学习中我们会逐步的解决掉这个问题
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 将这个配置先注释掉
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

解决方案2,在HTML页面,form表单内部,添加{% scrf_token %}即可解决,参考上面的代码,下面红框就是添加后的网页源码,

image-20240228181304007

image-20240228181510288

image-20240228182906297

登录成功就会自动重定向

request的属性以及方法

<!-- register.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <style>
        fieldset {
            width: 300px;
        }

        legend {
            text-align: center;
        }
    </style>
</head>
<body>
<form action="" method="post">
    <fieldset>
        <legend>请输入用户名以及密码</legend>
        <label for="username">账号:</label>
        <input id="username" name="username" type="text" placeholder="在此处输入用户名">
        <br>
        <label for="password">密码:</label>
        <input id="password" name="password" type="password">
        <br>
        爱好:
        <input name="hobby" id="kill" type="checkbox" value="抢人头">
        <label for="kill">抢人头</label>
        <input name="hobby" id="fish" type="checkbox" value="摸鱼">
        <label for="fish">摸鱼</label>
        <input name="hobby" id="cut-class" type="checkbox" value="逃课">
        <label for="cut-class">逃课</label>
        <br>
        <input id="hobby" type="submit" value="提交">
    </fieldset>
</form>
</body>
</html>

image-20240227192823852

def register(request):
    query_dict = request.POST:
    username = query_dict.get('username')  # 获取单个值
    password = query_dict.get('password')  # 获取单个值
    hobby = query_dict.getlist('hobby')    # 获取多个值,一般是用于接收form表单的多选框数据

    print(username, password, hobby)  # 小满 123 ['抢人头', '摸鱼', '逃课']
    return render(request, 'register.html')

QueryDict.dict() 转成纯字典

request.POST.dict()
request.GET.dict()
posted @ 2024-03-23 00:49  小满三岁啦  阅读(2)  评论(0编辑  收藏  举报