昨日回顾
根据用户访问的不同路径返回不同的页面
手动对
http
请求格式的数据进行一系列处理获取到用户访问的路径后逻辑判断
借助于
wsgiref
模块帮助我们处理socket以及http
数据
动态获取数据
后端利用字符串的替换 替换html中特殊符号的部分
基于
jinjia2
完成模板渲染 {{
后端传来的变量名
}} 接收数据
jinjia2
模块提供了和python
后端几乎一样的操作数据的方式
{{ }} 与变量相关
{% %} 与逻辑相关
python三大主流框架 Django
Flask
tornado
今日内容
路由访问如果不加斜杠,会重定向访问加斜杠的路由
所有的
html
文件都是templates
文件夹下所有的静态文件(除
html
文件,如css
、js
等文件) 默认都放在static
文件夹下STATIC_URL = '/static/' # 访问接口前缀 跟静态文件夹的名字无关 一般情况下与静态文件夹相同 # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), # 静态文件夹匹配路径 ... # 可匹配多个路径,按顺序匹配,一旦成功就停止 ]
暴露给外界能够访问服务器静态文件夹下面所有的资源
form
表单提交数据方式全路径
<form action="127.0.0.1..."></form>
只写后缀
<form action="login/"></form>
POST | GET 请求方式
<form action="login/" method="POST"></form> # GET
后端获取请求方式
request.method
获取请求方式POST
|GET
(默认获得全大写字符串)# 推荐写法 if request.methon == "POST": return HTTPresponse("ok") return render(request,"login.html")
后端获取数据方式
request.POST
&request.GET
#获取数据方式方式相同request.POST
# 客户端发送的数据,以数组套字典形式发送request.POST.get(‘key’)
# 默认获得value
列表中的最后一个值request.POST.getlist(‘key’)
# 获得value
列表中的所有值 场景:用户可多选数据request.POST.[‘KEY’]
# 不推荐使用注释校验
后端访问数据库
通过
pymysql
模块import pymysql conn = pymysql.connect( host="127.0.0.1", port=3306, user='root', ... )
通过
pycharm
自带mysql
驱动连接数据库通过
Django
配置mysql
数据库DATABASES = { 'defalut' : { 'ENGINE':'django.db.backends.mysql', 'NAME':'DATABASE_NAME', 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'USERNAME', 'PASSWORD':'PASSWORD' } }
在
Project
下的init.py
中修改import pymysql pymysql.install_as_MySQL() # 告诉django用
ORM
对象关系映射models.py
中 建立 表类class User(models.Model): id = models.AutoField(primary_key=True) # 建立主键 name = models.CharField(max_length=32) # name 字段是 varchar(32) # CharField在定义时必须加上max_length参数 password = models.CharField(max_length=32)
django
的ORM
不能自动帮你创建库,但是能自动创建表一个
Django Project
只使用一个库!!不要多个Django Project
使用同一个库数据库迁移(同步)命令
操作
migration
中的init.py
python3 manage.py makemigrations
# 将数据库变动记录到一个文件中 # 并不会在数据库中创建表,只是一次记录
python3 manege.py migrate
增删改查指令
######增##### # 方式一 user_obj = models.User.objects.create(name=username,password=password) # 增加数据 # 方式二 user_obj = models.User(name=username, password=password) user_obj.save() # 增加数据 ######查##### user_list = models.User.objects.all() # 查询全部数据 无数据为空列表 rs = models.User.objects.filter(id = delete_id) # 条件查询获取对象列表 无数据1为None obj = models.User.objects.get(id = edit_id) # 直接获取到数据对象(不推荐,无数据则报错) ######删##### rs = models.User.objects.filter(id = delete_id).delete() # 删除queryset中全部对象 ######改##### models.User.objects.filter(id = edit_id).update(name=username,password= password) obj = models.User.objecys.filter(id = edit_id).first() obj.name = username obj.save() ##### user_obj # 操作的表对象 user_obj.pk # .pk 获得该条记录的主键值 user_list.query # 查看执行的sql语句 必须是 queryset 对象
<a>
标签实现增加\删除数据<a href="/register/">增加</a> <a heaf="/delete/?delete_id={{ user_obj.pk }}"></a> <!--将 id 作为 GET 请求参数发送-->
向后端发送 id 的方法
<input type="hidden" name = "edit_id" value= {{ edit_id }}> <!--隐藏标签-->
一对多外键字段的建立
publish = models.ForeignKey(to="Publish") # 外键字段名 ORM 会自动在字段名后面加_id
多对多外键字段的建立
author = models.ManytoManyField(to="Author") # Django会自动创建第三张表 # 多对多字段不会显示到表的字段中