python 学习之 django
静态文件及相关配置
静态文件
html页面上使用的不经常改变的资源
- 第三方框架文件
- css文件
- js文件
- 图片文件
针对静态文件资源一般都会放在 static 文件夹内
当static目录下出现了很多不同类型的静态文件资源,那么还可以分类管理
-
others文件夹
第三方框架文件
-
css文件夹
所有的css文件
-
js文件夹
所有的js文件
-
img文件夹
所有的img文件
配置文件
针对静态文件资源的访问也需要提前开设相应的接口
STATIC_URL = '/static/' # 接口前缀,静态文件别名
# 静态文件资源配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static') # 静态文件地址拼接
]
静态
<link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
请求方法
GET
-
从指定的资源请求数据
-
也可以携带额外的数据,在传输过程,数据被放在请求的 URL 中(不安全的):
url?xxx=yyy&zzz=ooo&aaa=bbb上述携带数据的方式有两个限制
- 数据只能是一些无关紧要的非敏感数据(不安全)
- .数据大小有限制 2KB~4KB左右(受 URL 长度限制)
-
GET请求没有请求体(HTTP数据格式)
-
get 是 Form 的默认方法,可通过
method="post"进行修改
POTS
-
向指定的资源提交要被处理的数据
-
也可以携带额外的数据
数据都是放在请求体中 并且数据大小没有限制
GET 提交参数一般显示在 URL 上,POST 通过表单提交不会显示在 URL 上,POST 更具隐蔽性
Form 表单默认的数据提交方式是get
method="post" # 请求方法
action="" # 控制数据的提交地址
'''
action
方式1:不写 朝当前页面所在的地址提交
方式2:写后缀 /index/ 自动补全ip和port
方式3:写全称 https://www.baidu.com/'''
提交post请求,默认会报403错误,前期不需要过多考虑,直接去配置文件中注释一行即可 :
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
request对象方法
request.method # 获取请求方式 结果是纯大写的字符串
request.POST # 获取POST请求发送来的普通数据(不包含文件)
request.POST.get() # 默认只获取列表中最后一个数据值
request.POST.getlist() # 获取键对应的整个列表 无论有几个数据值
request.GET # 获取url后面携带的非敏感数据
request.GET.get() # 默认只获取列表中最后一个数据值
request.GET.getlist() # 获取键对应的整个列表 无论有几个数据值
例
def login(request):
'''该函数将来会通过不同的请求方式触发 并且需要执行不同的业务逻辑代码'''
# print(request.method)
if request.method == 'GET':
# 1.返回给前端浏览器一个登录页面
return render(request, 'login.html')
elif request.method == 'POST':
# 获取用户提交的数据
print(request.POST) # <QueryDict: {'username': ['kwan'], 'password': ['123']}>
res = request.POST.get('username')
print(res, type(res)) # kwan <class 'str'>
# print(request.POST) # <QueryDict: {'username': ['jason', 'kevin', 'oscar'], 'password': ['123']}>
# res = request.POST.get('username')
# print(res, type(res)) # oscar <class 'str'> 默认只获取列表中最后一个数据值
# res1 = request.POST.getlist('username') # 获取键对应的整个列表 无论有几个数据值
# print(res, type(res))
# print(request.GET) # <QueryDict: {'xxx': ['yyy'], 'zzz': ['ooo'], 'aaa': ['bbb']}>
return HttpResponse("收到了")
pycharm连接MySQL
-
查找 pycharm 提供的 database 按钮

-
首次链接数据库需要下载对应的驱动
-
直接 Apply
-
成功链接

django链接MySQL
django默认使用的是sqlite3,但是这款数据库一般只用于本地测试,功能较少
-
配置文件中修改配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 指定数据库软件名称 'NAME': 'db', # 指定库名 'USER': 'kwan', 'PASSWORD': '123', 'HOST': '127.0.0.1', 'PORT': 3306, 'CHARSET': 'utf8' } } -
指定链接MySQL的模块
-
django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码
import pymysql pymysql.install_as_MySQLdb() -
django2.2 以上版本需要使用 mysqlclient 模块
pip install mysqlclient
-
ORM
ORM概念
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
类 映射成 表
对象 映射成 记录
对象点属性 映射成 字段对应的值
"""
ORM的存在可以让不会MySQL的python程序员 使用python的语法简单快捷的操作MySQL
"""
Django 中 orm 基本使用
-
先去应用目录下的models.py编写模型类
class User(models.Model): # 类似于定义了表名 id int primary key auto_increment id = models.AutoField(primary_key=True) # 类似于定义了主键 # name varchar(32) name = models.CharField(max_length=32) # 类似于定义了普通字段 # pwd int pwd = models.IntegerField() # 类似于定义了普通字段 -
数据库迁移/同步命令
-
将models中有关数据库的操作记录下来(migrations文件夹)
python38 manage.py makemigrations -
将操作真正影响到数据库中
python38 manage.py migrate '''当修改了models中与数据库相关的代码 都必须执行上述的命令''' ps:可以简写 也可以指定应用单独迁移/同步
-
-
表的主键在orm中,可以不写,orm会自动帮你添加一个 id 的主键
如果你需要主键的名称不叫 id 只能自己创建
orm 语法
-
查
models.User.objects.filter() 结果可以看成是一个列表套数据对象 '''如何获取对象 可以使用first()方法 如果没有值会返回None 我们if判断即可''' -
增
models.User.objects.create() -
改
models.User.objects.filter(id=1).update(name='jason') -
删
models.User.objects.filter(id=4).delete()
orm外键关联
MySQL外键关联
| 关系 | 关联 |
|---|---|
| 一对多 | 外键字段建在多的一方 |
| 多对多 | 外键字段建在第三张关系表 |
| 一对一 | 外键字段建在查询频率较高的表中 |
ORM
| 关系 | 关联 |
|---|---|
| 一对多 | 外键字段建在多的一方 |
| 多对多 | 外键字段可以直接写在某张表中,orm会自动帮你创建第三张表 |
| 一对一 | 外键字段建在查询频率较高的表中 |
-
一对多
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) -
多对多
authors = models.ManyToManyField(to='Authors') -
一对一
detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)

浙公网安备 33010602011771号