django小白必会三板斧 静态文件 request对象方法 pycharm连接MySQL django连接MySQL django orm介绍、基本使用、数据操作
day51
django小白必会三板斧
# 启动django项目之后 如何添加更多的功能
如果要添加功能 就去urls.py和views.py
# diango自带重启功能
当识别到项目中代码有变化之后 隔段时间会自动重启 但是间隔时间较慢 建议手动重启来自查代码
# 与浏览器打交道的视图函数都应该有返回值
HttpResponse
主要用于返回字符串类型的数据
render
主要用于返回html文件 并且支持模版语法 还可以给index页面传值
redirect
主要用于重定向 括号内可以写其他网站的全称 也可以写自己网站的后缀
(如果要返回一个页面 让你重新返回另外一个页面)
还可以跳转到自己写的页面 (从index页面跳转到home)
登录功能
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源
是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
言外之意就是没有开设借口 就无法访问
# 1.开设接口返回登录页面
# 2.需求:登录页面需要用到bootstrap并且还需要自己编写css和js
静态文件
# 3.页面需要获取前段用户数据并且传递给后端
from表单
action参数:控制数据的提交地址
method参数:控制请求的提交方式
# 4.访问登录页面
静页面全部显示资源不存在
http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
原因:没有开设静态资源访问的接口
# 5.开设静态资源的访问接口
理论上应该自己去路由层开设接口资源 但是由于静态文件资源使用频率很高
只要是一个web项目都肯定需要 所以django为了避免开发者繁琐 提供了静态资源的配置文件
只需要填写固定的配置即可开设资源接口 settings.py
# html页面路径
在static文件夹下创建css文件 mycss.css
经过配置后我们也可以通过网页加后缀直接访问html页面
/static/mycss.css
# 6.配置文件中的'/static/' 与 'static' 两者区别
以该地址为例:
/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
/static/是接口前缀 表示具备访问静态文件资源的权限
获得权限之后会拿着接口前缀后面的文件路径去列表中每个文件夹查找
bootstrap-3.3.7-dist/css/bootstrap.min.css
找到一个就结束
比如 static和static1里面都有a.txt 那么只会拿到static中的
# 配置文件中为何是列表形式(列表是用来储存多个元素的)
意味着可以在列表中写多个文件的。查找顺序从上至下 找到一个就结束
# 7.接口前缀动态绑定
思考:如果templates中有很多html文件并且都需要引入静态资源 如果我们把接口前缀修改了
结果:页面无法加载资源
解决方案就是在html文件中写入以下代码 让接口前缀动态绑定 后续就能被随时修改前缀而不受影响
静态文件
写完后 不会经常被修改与html页面相关的文件
eg:
css文件、js文件、图片文件、第三方框架文件(bootstrap)
上述文件都可以称之为'静态文件'
在django中静态文件单独开设一个文件夹储存 默认叫 static文件夹
在该文件夹内还可以根据功能的不同继续划分不同的文件
eg:
css文件夹 js文件夹 img文件夹 others文件夹
request对象方法
提交post请求 默认会报403
前期不需要过多考虑 直接去配置文件中注释以下这行即可
1.get请求(get请求返回一个登录页面)和post请求(post请求获取用户数据并校验)都会触发同一个视图函数login的运行
如何针对不同的请求执行不同的代码
2.获取当前请求方式
request.method
返回的是纯大写的请求方法字符串
返回结果:GET/POST
3. 获取post请求提交的普通数据
request POST
打印结果是QueryDict 可以看成字典处理
request.POST.get('username')
拿到值 jason get方法会拿到值列表中最后一个元素 而不是整个列表
request.POST.getlist('hobby')
拿到值列表 ['111', '222', '333'] getlist方法会直接拿到整个值列表
4. 如何获取url后面携带的数据
request.GET 打印结果是一个QueryDict 可以看成字典处理
request.GET.get('info')
request.GET.getlist('citylist')
特征与上述request.POST一致 使用场景也很多
参考这个:https://www.lagou.com/wn/jobs?kd=python&isSchoolJob=1&city=%E4%B8%8A%E6%B5%B7&pn=1
pycharm链接MySQL
其实pycharm也可以充当很多数据库软件的客户端
在pycharm的 右上侧或者左下方的侧边找到 database
上述两个地方都没有 需要下载插件 或者直接重装一个正常的pycharm
# 链接数据库
1.选择数据库
2.首次链接需要下载驱动
download driver...
3.测试链接如果不通过 则需要换驱动重新下载使用
Driver:MySQL MySQL for 5.1
django链接MySQL
django默认自带一个sqlite3数据库 但是功能很少 仅用于本地测试
在settings中找到默认配置并修改
1.默认配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
2.修改配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'jp_05', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': 'jason123', } }
配置完后运行时报错 需要修改指定模块
3.指定模块
由于 MySQLdb 已经不维护了 我们要修改成使用 pymysql
在项目同名的文件夹内的__init__.py或者应用名的文件夹内的__init__.py
添加固定的代码
import pymysql pymysql.install_as_MySQLdb()
django orm简介
ORM:对象关系映射
# 特点
能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL
好处:提升了开发效率...
坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优
# 概念
orm在表与类之间做转换 让程序员可以使用python语法直接操作mysql
对应关系:
表 类
一行行数据 转换 类产生的一个个对象
数据字段 对象的一个个属性
orm基本使用
# 如果需要使用ORM 需要去应用下的models.py中编写代码
1.编写类代码 以下代码等同于写了一张表
2.执行数据库迁移命令 可以看作是将编写的数据真正同步到数据库
在pycharm中左下方找到 Terminal 输入以下代码:
python3 manage.py makemigrations
# 记录操作
python3 manage.py migrate
# 将操作迁移到数据库 这步是真正的创表
首次执行迁移命令 django还会自动创建一些默认需要使用到的表
3. 表名的特征
Users app01_users
由于django支持多个应用 为了区分不同应用下可能会出现相同的表名
所以自动加上了应用的前缀 因为同一个应用下不可能出现相同的表名
4. 扩展
1. 表的主键可以不写 orm会自动帮你写一个名为id的主键
2. 每次修改了跟数据库相关的ptyhon代码 都需要重新执行迁移命令
针对两个迁移命令 可以采用pycharm提示功能编写
tools
run manage.py task
orm数据操作
# 1. 添加数据
等同于 insert into app_01users(name, pwd) values('jack','333');
user_obj = models.Users.objects.create(name='jack', pwd='333')
print(user_obj)
# Users object
print(user_obj.uid)
# 4
print(user_obj.name)
# jack
print(user_obj.pwd)
# 333
# 2. 查询数据
# 等同于 select * from app01_users where name='jason';
res = models.Users.objects.filter(name='jason')
print(res)
# <QuerySet [<Users: Users objects>]>
print(res[0])
# Users objects
print(res[0].uid)
# 1
print(res[0].name)
# jason
priint(res[0].pwd)
# 123
# 3. 修改数据
# 等同于 update app01_users set name='jason666' where uid=1;
models.Users.objects.filter(uid=1).update(name='jason666')
# 4. 删除数据
# 等同于 delete from app01_users where uid=3;
models.Users.objects.filter(uid=3).delete()