django

# Django
- 中文教程文档: http://python.usyiyi.cn
- anaconda使用
- conda list: 显示当前环境安装的包
- conda env list: 显示安装的虚拟环境列表
- conda create -n env_name python=版本号
- 激活conda的虚拟环境
- (Linux)source activate env_name
- (window) activate env_name
- pip install django==版本号


## 创建第一个Django程序流程
- 命令行下启动Django
1. django-admin startproject 项目名
2. cd 项目名
3. python manage.py runserver
- pycharm下启动
1. 需要配置

## 路由系统——urls
- 创建App
- app: 负责一个具体业务或者一类具体业务的模块
- 创建: python manage.py startapp app名称

- 路由
- 按照具体的请求url,导入相对应的业务处理模块的一个功能模块
- Django的信息控制中枢
- 本质上是接收的url和相应的处理模块的一个映射
- 在接收url请求的匹配上使用了RE(1.8版本)
- url的具体格式由urls.py所示

- 1.url匹配规则
- 子url一旦被调用,则不会返回到主url(不会逆向匹配)
- 正则依r开头,表示不需要转义,注意尖号(^: 以什么开头)和美元符号($: 以什么结尾)
- '/one/two/three/' 配对 r'^one/'
- '/oo/one/two/three/' 不配对 r'^one/'
- '/one/two/three/' 配对 r'three/$'
- '/one/two/three/oo/' 不配对 r'three/$'
- 开头不需要有反斜杠(默认忽略)
- 如果从上向下都没有找到合适的匹配内容,则报错

- 2.正常映射
- 把某一个符合RE的url映射到事务处理函数中去

- 3.url中带参数映射
- 在事件处理代码中需要由url传入参数,形如: /myurl/param中的param
- 参数都是字符串形式,如果需要整数等类型需要自行转换格式

- 4.url在App中的处理
- 如果所有应用url都集中 项目名/urls.py 中,可能导致文件的臃肿
- 可以把urls具体功能逐渐分散到每个App中
- 从Django.conf.urls 导入 include
- 注意此时RE部分的写法
- 添加include导入
- 使用方法
- 1. 确保include被导入
- 2. 写主路由的开头url
- 3. 写子路由
- 4. 编写views函数
- 同样可以使用参数
- 5.url中的嵌套参数
- 捕获某个参数的一部分
- ?: : 表示忽略此参数

- 6.传递额外参数
- 参数不仅仅来自url,还可能是我们自己定义的内容

- 7.url反向解析
- 防止硬编码
- 本质上是对每一个url进行命名
- 以后在编码代码中使用url的值,原则上都应该使用反向解析

## 视图
- 视图即视图函数,接收web请求并返回web响应的事物处理函数
- 响应指的是符合http协议要求的任何内容,包括json,string,html等

- 简单视图
- Django.http给我们提供了很多和httpResponse类似的简单视图
- 此类视图的使用方法基本类似,可以通过return语句作为直接反馈返回给浏览器
- Http404为Exception子类,所以需要raise来使用

- HTTPResponse详解
- 方法
- init: 使用页内容实例化HTTPResponse对象
- write(content): 以文件的方式写
- flush(): 以文件的方式输出缓存区
- set_cookie(key, value='', max_age=None, expires=None): 设置Cookie
- key,value都是字符串类型
- max_age是一个整数,表示在指定秒数后过期
- expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime和timedelta值只有在使用PickleSeriallizer时才可序列化
- max_age与expires二选一
- 如果不指定过期时间,则两个星期后过期
- delete_cookie(key): 删除指定的key的cookie,如果key不存在则什么也不发生

- HTTPResponseRedirect
- 重定向,服务器端跳转
- 构造函数的第一个参数用来指定重定向的地址

- Request请求
- request介绍
- 服务器接收到http协议的请求后会根据报文创建HTTPRequest对象
- 视图函数的第一个参数是HTTPRequest对象
- 在Django.http模块中定义了HTTPRequest对象的API
- 属性
- path: 一个字符串,表示请求的页面的完整路径,不包含域名
- method: 一个字符串,表示请求的使用的http方法,常用值包括: 'GET', 'POST'
- encoding: 一个字符串,表示提交的数据的编码方式
- 如果为None则表示使用浏览器的默认设置,一般为utf-8
- 这个属性是可写的,可以通过修改他来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
- GET: 一个类似于字典的对象,包含get请求方式的所有参数
- POST: 一个类似于字典的对象,包含post请求方式的所有参数
- FILES: 一个类似于字典的对象,包含所有的上传文件
- COOKIES: 一个标准的Python字典,包含所有的cookie,键和值都为字符串
- SESSION: 一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django启用会话的支持时才可用,详细内容见“状态保持”
- 方法
- is_ajax(): 如果请求是通过XMLHTTPRequest发起的,则返回True
- QueryDict对象
- 定义的django.http.QueryDict
- request对象的属性GET,POST都是QueryDict类型的对象
- 于Python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
- 方法get(): 根据键获取值、只能获取键的一个值、如果一个键同时拥有多个值,则获取最后一个值
- 方法getlist(): 根据键获取值,将键的值以列表返回,可以获取一个键的多个值
- GET属性
- QueryDict类型的对象
- 包含get请求方式的所有参数
- 与URL请求地址中的参数对应,位于?后面
- 参数的格式是键值对,如key1=value1
- 多个参数之间,使用&连接,如key1=value1&key2=value2
- 键是开发人员定下来的,值是可变的

- POST属性
- QueryDict类型的对象
- 包含post请求方式的所有参数
- 与form表单中的控件对应
- 表单中控件必须有name属性,name为键,value为值
- CheckBox存在一键多值的问题
- 键是开发人员定下来的,值是可变的

- 手动编写视图
- 实验目的
- 利用Django快捷函数手动编写视图处理函数
- 编写过程中理解视图运行原理

- 分析:
- Django把所有请求信息封装如request
- Django通过urls模块把相应的请求跟事件处理函数连接起来,并把request作为参数传入
- 在相应的处理函数中,我们需要完成两部分
- 处理业务
- 把结果封装并返回,我们可以使用简单HTTPRequest,同样也可以自己处理此功能

- 系统内建视图
- 可以直接使用


- Models模型
- ORM(ObjectRelationMap)
- 把面向对象思想转换成关系数据库思想,操作上把类等价于表格
- 类对应表
- 类中的属性对应表中的字段
- 在应用中的model.py文件中定义class
- 所有需要使用ORM的class都必须是 model.Model 的子类
- 字段的类型都必须使用 model.xx 不能使用Python中的类型
- 在Django中,models负责跟数据库交互
- Django连接数据库
- 自带默认数据库sqllite3
- 关系型数据库
- 轻量级
- 建议开发的时候使用sqllite3,部署用mysql之类的数据库
- 切换数据库在settings中进行设置
# django连接mysql
DATABASE = [
'defalut': {
'ENGINE' : 'django.db.backends.mysql',
'NAME' : '数据库名',
'PASSWORD' : '数据库密码',
'HOST' : '数据库地址',
'PORT' : '数据库端口号',
}
]
- 需要在项目文件下的__init__文件中导入pymysql包

# 在主项目中的__init__文件中
import pymysql
pymysql.install_as_MYSQLdb()

- 数据库的迁移
1. 在命令行中,生成数据迁移的语句(生成sql语句)
python manage.py makemigrations
2. 在命令行中,输入数据迁移的指令
python manage.py migrate
# 如果迁移中出现没有变化或者报错,可以尝试强制迁移
python manage.py makemigrations 应用名
python manage.py migrate 应用名
3. 对于默认数据库,为了避免出现混乱,如果数据库中没有数据,每次迁移前可以把系统自带的sqllite3数据库删除


### 查看数据库中的数据
- 启动命令行: python3 manage.py shell
- 在命令行中导入相对应的映射类
- from 应用名.models import 类名
- 使用objects属性操作数据库.objects

- 常见的查找方法
1. 通用查找格式: 属性名__(用下列内容) = 值
- gt: 大于
- gte: 大于等于
- lt: 小于
- lte: 小于等于
- range: 范围
- year: 年份
- isnull: 是否为空
2. 查找等于指定值的格式: 属性名 = 值
3. 模糊查找: 属性名__(用下列内容) = 值
- exact: 精确大小
- iexact: 不区分大小写
- contains: 包含
- startwith: 以...开始
- endwith: 以...结尾

## 数据库表关系
- 多表联查,利用多个表联合查找某一项信息或者多项信息



## 模板系统
- 步骤:
- 在settings中进行设置: TEAMPLATES
- 在teampltaes文件夹下编写模板并调用
- 模板-变量
- 变量的表示方法{{var_name}}
- 在系统调用模板的时候,会用相应的数据查找相应的变量名称,如能找到,则填充,否则跳过

- 模板-标签
- for标签: {%for..in..%}
- 用法:
{% for..in..%}
循环语句
{% endfor %}

- if标签:
- 用法:
{% if 条件 %}
条件成立执行语句
{% elif 条件 %}
条件成立执行语句
{% else %}
以上条件都不成立执行语句
{% endif %}

- csrf标签:
- csrf(跨站请求伪造)
- 在提交表单的时候,表单页面需要加上{% csrf_token %}


## session(为了应对HTTP协议的无状态性)
- 用来保存用户比较敏感的信息
- 属于request的一个属性
- 常用操作:
- request.session.get(key, defaultValue)
- request.session.clear(): 清除全部
- request.session[key] = value: 赋值
- request.session.flush(): 删除当前会话并且清除会话的cookie
- del request.session[key]: 也是删除


## 分页
- django提供现成的分页器来对结果进行分页
- from django.core.paginator import Paginator

## 基于类的视图
- 可以针对HTTP协议不同的方法创建不同的函数
- 可以使用Mixin等oop技术
- Mixin
- 把来自父类的行为或者属性组合在一起
- 解决多重继承问题
- ListView



## admin
- 创建Admin
- settings.py中填入app
- 打开urls.py
- 创建超级用户python manage.py createsuperuser
- 配置settings文件
- 绑定管理模型
- 在admin.py中from jokeiApp.models import ClassRoom, Student, Teacher
- 然后进行绑定admin.site.register(Student)
- 设置admin管理类
- 实现方法
- AdminInfo
- 装饰器
- 修改页面显示数量: list_per_page
- 操作选项: actions_on_top/button
- 控制列表中显示的内容: list_display=[]
- 将方法作为列显示
- 函数必须返回值
- 设置short_descraption作为显示内容
- 排序使用admin_order_field
posted @ 2019-02-19 13:35  承丶承承承  阅读(243)  评论(0编辑  收藏  举报