请求与响应

常用的请求逻辑处理
if request.method == 'GET':
    pass
elif request.method == 'POST':
    #处理用户提交的表单数据
    pass
else:
    pass
GET处理
if request.method == 'GET':
    pass

​ 产生GET请求的场景:(少量无隐私数据)

​ 1.浏览器地址栏输入URL后

​ 2.<a href="地址?参数=值&参数=值“>

​ 3.form表单中的method为get

注意:不要串敏感数据

​ GET请求数据传递格式:

​ URL?参数=值&参数=值.....

​ 如:http://127.0.0.1:8000/test_request?a=3&b=4

获取GET中的数据
if request.method == 'GET':
    #输入:http://127.0.0.1:8000/test_get_post?a=100
    #获取请求字典中键a的值,如果GET中没有,则会报错
    print(request.GET['a'])#100
    # 获取请求字典中键c的值,如果没有提供默认值get(key,默认值)
    print(request.GET.get('c','default'))#default

    # 输入:http://127.0.0.1:8000/test_get_post?a=100&a=200&a=300
    #如果GET中有多个a的值:
    # 可以用getlist()获取一个键a的值的列表
    #继续用get(),则会返回列表中的最后一个值
    #用途:GET方法的问卷调查:多选按钮
    print(request.GET.getlist('a'))#['100', '200', '300']
    print(request.GET.get('a'))#300
POST处理
if request.method == 'GET':
    pass

产生POST请求的场景:表单,隐私数据,大量数据

如:(此处action前要加/)

<form method='post' action = ' /login'>
    姓名:<input type='text'name='username'>
    <input type='submit' value='登录'>
</form>
获取POST中的数据

(大体上与GET方式相同)

        #处理用户提交的表单数据
        print(request.POST.get('username','default'))

STATIC静态资源管理

相关语句

STATIC_URL = 'statics/'  #匹配请求
STATICFILES_DIRS = [BASE_DIR / 'static'] #资源文件夹地址
<img src="http://127.0.0.1:8000/static/img/car1.png" alt="" width="200px" height="200px">
<img src="/static/img/car1.png" alt="" width="200px" height="200px">
{% load static %}
<img src="{% static 'img/car1.png' %}" alt="" width="200px" height="200px">

STATIC_URL:用于匹配静态资源请求

STATICFILES_DIRS:用于django查找内部静态资源

静态资源查找符:需要现在HTML中添加{% load static%}语句才能使用

             格式:{% static '路径' %}

静态资源请求方式

            1.绝对路径请求:

                    http://127.0.0.1:8000/static/img/car1.png

            2.相对路径请求:

                    /static/img/car1.png

             3.静态资源符请求: (一般推荐此方法访问静态资源)(动态方法)

                    {% static 'img/car1.png' %}

如果STATIC_URL改变,那么1,2两种方式中的请求路径也要改变,否则404,而静态资源符依然能够动态访问

静态资源显示流程

        1.浏览器发起请求,

        2.django检查请求是否符合STATIC_URL,若符合则返回STATICFILES_DIRS路径的静态资源,否则返回404

        注意:如果请求中包含静态资源查找符,则直接返回STATICFILES_DIRS路径的静态资源

分布式路由(命名空间)

Django中,主路由配置文件(urls.py)不处理用户具体路由,只起到一个分发路由的作用,具体路由请求由各个应用的路由配置文件(urls.py)来处理

image-20220502153158074

主路由配置

path('命名空间',include('应用子路由'))

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    #分布式路由(命名空间)
    path('mysite3/',include('mysite3.urls')),
]

子路由配置

urlpatterns = [
    path('index/',views.index_mysite3),
    path('music/',views.music),
    path('movie/',views.movie),
]

注意

1.django中的模板文件访问顺序为:从外到内,从上到下

从外到内:优先访问外部templates

从上到下:按照文件中INSTALLED_APPS列表的顺序从上到下访问。

若无外部templates文件夹,则优先index应用中的内部文件夹templates,再其次是mysite3中的模板文件夹

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
    'mysite3',
]

2.如外部模板文件夹和应用内部模板文件夹中存在相同文件名,访问顺序一般遵从1中的访问顺序

若相同文件名不可避免,可通过增加文件夹的方式解决:

​ 1.在应用模板文件夹中增加与应用同名文件夹

image-20220502154600845

​ 2.视图文件中的路径要修改为: "应用/html文件"

#当前视图函数:
def index_mysite3(request):
    return render(request,'mysite3/index.html')

​ 一般来说,在开发过程中一个项目中的不同app也是分开开发的,等开发完成后才会耦合到一起,不同app模板分开也比较符合这个思想

数据库

1.连接数据库

2.创建数据表

​ a. models.py中的类将会被创建成数据表

image-20220414173304756

b.项目终端后输入以下命令将models.py中的类生成数据表

​ Python创建数据表命

img

注意

Mysql 插入中文错误:Incorrect string value: '\xE7\xA8\x8B\xE5\xBA\x8F...' for column 'course' at row 1

在Navicat中修改字符集

在终端输入命令

alter table 表名change 列名 列名 varchar(50) character set utf8;

或者重建数据库

CREATE DATABASE IF NOT EXISTS [数据库名]
DEFAULT CHARACTER SET utf8mb4 #字符编码
DEFAULT COLLATION utf8mb4_unicode_ci; #排序规则

3.数据的增删改查

增:

UerInfo.objects.create(name="acidcola",password="123",age=22)

​ 类名(列表名).objects.create(key = value)

删:

models.UerInfo.objects.filter(name="周易").delete()

filter(name = "周易")表示筛选name="周易"的数据行并删除

案例:用户信息管理

注意

1.需要在html文件中加上代码,否则报错

{% csrf_token %}

image-20220415122247490

2.禁用csrf中间件

查询用户信息

  1. 视图函数中,获取数据库信息,并返回给网站
from  app2.models import UerInfo
def list_info(request):
    datalist = UerInfo.objects.all()
    return render(request,'list_info.html',{'datalist':datalist})

​ 2.在html文件中通过硬编码获取服务器返回的值

{% for foo in datalist %}
    <tr>
        <td>{{ foo.id }}</td>
        <td>{{ foo.name }}</td>
        <td>{{ foo.password }}</td>
        <td>{{ foo.age }}</td>
    </tr>
{% endfor %}

添加用户信息

1.访问路由/app2/info/add/通过get方法获取添加信息网页

if request.method == 'GET':
    return render(request,'add_info.html')

2.网页以post方法提交

<form method="post">
    {% csrf_token %}
    <input type="text" name="user" placeholder="用户名">
    <br>
    <input type="password" name="pwd" placeholder="密码">
    <br>
    <input type="text" name="age" placeholder="年龄">
    <br>
    <input type="submit" value="提交">
</form>

3.获取post请求中的数据,并存入数据库

#获取用户提交的数据
user = request.POST.get("user")
pwd = request.POST.get("pwd")
age = request.POST.get("age")

#添加到数据库
UerInfo.objects.create(name=user,password=pwd,age = age)
return HttpResponse("添加成功")

4.跳转到查询界面

#重定向至查询界面
return redirect("/app2/info")

Q.E.D.


新手上路