django项目就类似于一所大学,各个app 就相当于二级学院
以登录功能为例走一个django项目(今日内容 引子)
1|0关于静态资源访问
你可能会发现,在我们目前的 django 项目中的 html 模板中链入的 css 、js (这里只服务器本地的,CDN等除外)明明路径是对的,请求得到的却是 404 资源不存在
1|1为什么要配置静态文件才能获取静态资源
用户可以访问的资源,都在 url 中
只有 url 中开设(配置)相关的资源你才能访问到(不然就可以根据路径把网站源码都拿过去了)
后端资源一般都需要手动指定是否需要暴露给用户
配置完之后也只有输入完整的文件路径才能访问到(也相对是一种保护措施)
对于前端已经写好了的文件,我们只是拿过来使用,那么这些文件都可以称之为 “静态文件”
html文件默认全部放在 templates 文件夹下(并且,如果是命令行创建的项目,并不会自带 templates 文件夹,自己创建的就需要去配置文件里配置)
1|2常见的静态文件种类
-
css
-
js
-
iamge (图片)
-
bootstrap、fontawesome等前端框架,已经写好了的
bootstrap-3.3.7-dist,bootstrap 是依赖于 jquery的,所以在导bootstrap 之前要先导入 jquery
1|3如何配置来开启访问权限
默认的 django 项目 是没有 static 这个文件的,需要自己手动创建 static 文件夹,然后需要去 settings.py 文件配置 static 静态资源相关
创建完 static文件夹后,一般还会再在里面手动创建三个文件夹
- css 放当前网站所有的 样式 文件(自己写的)
- js 放当前网站所有的 js 文件(自己写的)
- image 放当前网站所有的 图片 文件
1|4禁用浏览器缓存
写 django 项目最好禁用掉浏览器缓存,不然可能写的代码页面上缓存看不到效果、变化(资源加载地址等等)
要开着 F12开发者工具查看 *****
1|5django的自动重启机制(热启动)
实时监测文件代码变化,只要有变化,就会自动重启,可能代码还没有写完就会自动报错(如果有语法错误可能不会自动重启,遇到逻辑错误就会重启)
1|6静态文件接口动态解析
如果你的产品经理要让你上1000个静态资源的前缀改了,再改回来,总之就是改来改去,怎么办?
备注:这个一般是结合 static 静态文件配置来用的
使用静态文件接口动态解析
2|0向服务器发送数据
2|1利用 form 表单默认的 get 请求携带
form 表单提交方式默认是 get 请求,携带数据的方式是 url 问号后面跟数据(浏览器地址栏直接拼接也是一样的,本质都是发送一个请求过去,数据都封装成了请求的数据格式)
?username=jason&password=123
2|2form 表单改用 post 请求提交数据
- 把html模版中 form 表单的 method 改成 post(method=‘post’)
- 去 settings.py 里 把 CSRF 这个中间件禁用掉
2|3回顾:action提交地址的三种写法
- 不写的情况下 默认往当前地址提交(url)
- 还可以写后缀/index/ (django项目常用这种)
- 还可以写全路径
2|4代码区分请求方式
request.method
能够获取前端请求方式(并且是全大写的字符串 POST、GET)
推荐写法
可以根据这个来判断请求方式,对于不同的请求方式作出不同的处理
3|0获取请求带过来的数据
WSGI帮忙封装了 request 等,也经过了 Django后端,才有了request 这个对象(请求相关内容 全在 environ 里面)
GET、POST
3|1request.POST
获取前端表单 POST 提交的所有数据(就类似于一个大字典)
取数据
3|2request.GET
获取前端 GET 提交的所有数据(就类似于一个大字典)
取数据
4|0pycharm 图形化工具连接数据库
4|1准备工作,安装插件
然后安装一下插件( downloads...)
4|2配置连接信息
一定要注意选择那个 MySQL for 5.1(mysql 版本不高的时候),就两个选项反正不行换一个试试嘛
不然 Test Connection 可能会报错
4|3图形页面基本操作
不是重点,鼠标悬浮上去都有提示,自己看吧。。。
过滤多余的字符编码之类的?
不显示数据表?
5|0修改 django 项目配置(应用mysql)
django 默认使用的是自带的 sqlite 数据库(一种小型的做测试用的数据库)
要让 django 项目应用其他数据库(mysql),需要做如下两步配置
5|1在 settings.py 里面配置数据库连接信息
配置的时候 key 必须全大写
5|2指定数据库“软件”?
在项目名下的 __init__.py
文件或者是应用名文件下的 __init__.py
文件下加入一段代码(指定使用的数据库软件?)
django 默认用 MySQLdb 连数据库的(需要自己引入,MySQLdb 比较老了,兼容性也不太好,所以要自己指定)
6|0django ORM
跟之前 手撸ORM 核心思路一样,只不过这个更加强大而已(强大不知道多少倍去了)
6|1在models.py 里创表模型类
django 会默认给你的表创建一个名为 id 的主键字段,所以可以不写这个 id 主键
但如果不是名为 id (是 s_id) 那还是得自己写,一旦你已经指定了主键字段 那么 django 就不会主动再给你创建了
注意点
- CharField 必须指定 max_length 参数,不指定会报错
- 字段修改的注意点(下面有展开介绍)
- 其他注意点 ...
app01/models.py
6|2创建表、修改表--数据库迁移命令(同步到数据库)
python3 manage.py makemigrations
记录数据库迁移
仅仅是在 migrations 文件夹中 记录数据库的修改,并不会直接操作数据库
在当前 app 的 migration 文件夹下会多出一个 .py 文件(记录数据库更改)
python3 manage.py migrate
将数据库修改记录(migrations 中的记录)真正同步到数据库
要等一会儿(第一次执行数据库迁移(还是同步啊?没试)命令会自动创建一堆表(django需要依赖的表),后续就是更新多出来的这几张表的记录了)
6|3简便写法
这里写会有提示,但还是要会自己完整写, 万一面试让手写呢?
makemigrations
记录数据库迁移
会产生类似如下的文件
app01/migrations/0008_auto_20190916_2358.py
首次创建表时(写模型类时)
app01/migrations/0001_initial.py
migrate
同步到数据库
新增或者更新新出的那些 表的记录
注意
只要动了models 中跟数据库相关的代码,就必须重新执行上面的两条命令,缺一不可
特殊点--表名会自动加上模块的前缀
自动加前缀,可以方便协同开发,解耦合,合在一起就行了(那大家都创 app01 呢?)
6|4表字段的增删改
改完后必须执行数据库迁移的那两条命令
而且一般也不会让你去动表结构,表是在开发之前就要定下来的!
增加表字段
当表里已经有记录时,后续还要想添加字段,需要指定默认值 或者 允许新增字段为空
当没有记录 或者 表还未被创建时,则不会有上述问题
删除表字段
- 直接在表模型类里 加注释 / 删除
- 重新执行两条命令即可
强调!:执行完之后,表中该字段所对应的所有数据全部清空
---》 没事儿别瞎注释!或者删除(这不仅仅是python代码,还牵连着数据库)
并且一般也不会真正意义上的删除(除非设计不合理)
改字段
结合新增字段和删除字段(小推测,未实践)
6|5数据的增删改查(ORM)
导入 models 里面的表
查数据(跟前面手动封装的一样)
查记录
get(拿到一个对象,对象没有会报错,不推荐)
models.User.objects.get(username=username, 条件2)
filter(拿到列表,可以放多个参数(条件))
models.User.objects.filter(username=username, password=password, 条件3)
返回的是一个列表(QuerySet),里面放的才是一个个的对象
当查询条件不存在时,不会报错,只会返回一个空列表
filter 括号内支持写多个参数,并且参数之间是 and 关系
print(res.query)
可以打印查询语句(只有 QuerySet 对象才可以直接查看内部对应的 sql 语句) orm 暂时做个了解,后面有详解QuerySet 对象你可以把它当成列表操作,索引也可以用索引取,但是不推荐这么做( QuerySet 只支持整数索引,不支持负数) 还支持切片操作(也不支持负数,切出来的结果还是一个 QuerySet 对象)
QuerySet 封装的方法(个别)
..... filter().first() 拿列表中的第一个对象
空列表不会报错
不推荐你使用索引取值,一旦没有任何数据,再索引取值会报错,但是如果用 .first()
虽然内部也是按索引取值,但是没有数据, 也不会报错,返回的是None
models.User.objects.filter(username=username).first()
少了 .first() 会报这个错
all (拿到所有的)
models.User.objects.all()
直接拿到 User 表模型类的所有数据,结果是列表套对象
增加记录
新增对象的两种方式
create 方法
models.User.objects.create(username=username, password=password)
create方法能够新增数据并且有一个返回值
返回值就是新增的数据对象本身
实例化对象调用 .save()
删除记录
models.User.objects.filter(条件).delete()
html中利用 a 标签的 href 把参数发过去(加一个删除功能)
models.User.objects.filter(条件).delete()
更新记录
无论是什么请求,request.GET 都能拿到 url 里携带的参数
总体思路
.filter(条件).update(username=username, password=password) 批量更新
models.User.objects.filter(id=edit_id).update(username=username,password=password)
.filter 拿到的是一个列表,所以 .filter
的操作 都是批量操作(如果 .filter 结果列表中有多个数据,那么会一次性全部修改,就类似于 for循环一个个修改)
直接 对象.改属性 .save保存
不推荐!--> 会从头到尾将所有的字段修改一遍(遍历身上的属性),效率极低
用户信息增删改查
与ORM相关的代码实现
app01/views.py
7|0代码书写位置--个人小总结(待补充)
--> 暨 django 目录结构再解读
为了防止后期搞混,不知道代码往哪写,所以最好还是把,每个文件写在哪的搞清楚(app 里面还是项目同名文件夹下?)
7|1app文件下的
7|2项目同名文件下的
7|3app 和 项目同名目录 都可以放的
单独拎出来可能记得更深点吧
7|4项目根目录的