# Django系统
- 环境
- python3.6
- django2.0.5
- 参考资料
- [django中文教程](http://python.usyiyi.cn/)
- django架站的16堂课
# 环境搭建
- anaconda+pycharm
- anaconda使用
- conda list: 显示当前环境安装的包
- conda env list:显示安装的虚拟环境列表
- conda create -n env_name python=3.6
- 激活conda的虚拟环境
- (Linux)source activate env_name
- (win) activate env_name
- conda install django=2.0.5
# 后台需要的流程
# 创建第一个django程序
- 命令行启动
django-admin startproject tulingxueyuan
cd tulingxueyuan
python manage.py runserver
127.0.0.1:8000
- pycharm 启动
- 需要配置
# 路由系统-urls
- 创建app
- app:负责一个具体业务或者一类具体业务的模块
- python manage.py tartapp teacher
- 按照具体的请求url,导入到相应的业务处理模块的一个功能模块
- django的信息控制中枢
- 本质上是接受的URL和相应的处理模块的一个映射
- 在接受URL请求的匹配上使用了RE
- URL的具体格式入urls.py中所示
- 需要关注两点:
1. 接受的URL是什么,即如何用RE对传入URL进行匹配
2. 已知URL匹配到哪个处理模块
- url匹配规则
- 从上往下一个一个比对
- url格式是分级格式,则按照级别一级一级往下比对,主要对应url包含子url的情况
- 子url一旦被调用,则不会返回到主url
- `/one/two/three/`
- 正则以r开头,表示不需要转义,注意尖号(^)和美元符号($)
- `/one/two/three` 配对 r'^one/
- `/oo/one/two/three` 不配对 r'^one/"
- `/one/two/three/` 配对 r'three/$'
- `/oo/one/two/three/oo/` 不配对 r'three/$"
- 开头不需要有反斜杠
- 如果从上向下都没有找到合适的匹配内容,则报错
# 2. 正常映射
- 把某一个符合RE的URL映射到事物处理函数中去
- 举例如下:
```
from showeast import views as sv
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^normalmap/', sv.normalmap),
]
# 3. URL中带参数映射
- 在事件处理代码中需要由URL传入参数,形如 /myurl/param中的param
- 参数都是字符串形式,如果需要整数等形式需要自行转换
- 通常的形式如下:
```
/search/page/432 中的 432需要经常性变换,所以设置成参数比较合适
``` ```
# 4. URL在app中处理
- 如果所有应用URL都集中tulingxueyuan/urls.py中,可能导致文件的臃肿
- 可以把urls具体功能逐渐分散到每个app中
- 从django.conf.urls 导入 include
- 注意此时RE部分的写法
- 添加include导入
- 使用方法
- 确保include被导入
- 写主路由的开头url
- 写子路由
- 编写views函数
- 同样可以使用参数
# 5. URL中的嵌套参数
- 捕获某个参数的一部分
- 例如URL /index/page-3, 需要捕获数字3作为参数
```
url(r'index_1/(page-(\d+)/)?$', sv.myindex_1), #不太好
url(r'index_2/(?:page-(?P
```
- 上述例子会得到两个参数,但 ?: 表明忽略此参数
# 6. 传递额外参数
- 参数不仅仅来自以URL,还可能是我们自己定义的内容
```
url(r'extrem/$', sv.extremParam, {'name':"liuying"}),
```
- 附加参数同样适用于include语句,此时对include内所有都添加
# 7. URL的反向解析
- 防止硬编码
- 本质上是对每一个URL进行命名
- 以后再编码代码中使用URL的值,原则上都应该使用反向解析
# 1. 视图概述
- 视图即视图函数,接收web请求并返回web响应的事物处理函数.
- 响应指符合http协议要求的任何内容,包括json,string, html等
- 本章忽略事务处理,重点在如何返回处理结果上
# 2 其他简单视图
- django.http给我们提供类很多和HttpResponse类似的简单视图,
通过查看django.http代码我们知道,
- 此类视图使用方法基本类似,可以通过return语句昨晚直接反馈返回给浏览器
- Http404为Exception子类,所以需要raise使用
# 3. 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值只有在使用PickleSerializer时才可序列化
- max_age与expires二选一
- 如果不指定过期时间,则两个星期后过期
- delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生
# 4. HttpResponseRedirect
- 重定向,服务器端跳转
- 构造函数的第一个参数用来指定重定向的地址
- 案例 ShowViews/views.py
```python
# 在 east/urls中添加一下内容
url(r'^v10_1/', views.v10_1),
url(r'^v10_2/', views.v10_2),
url(r'^v11/', views.v11, name="v11"),
```
```python
# /east/ShowViews/views中添加一下内容
def v10_1(request):
return HttpResponseRedirect("/v11")
def v10_2(request):
return HttpResponseRedirect(reverse("v11"))
def v11(request):
return HttpResponse("哈哈,这是v11的访问返回呀")
```
# 5.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
- 键是开发人员定下来的,值是可变的
- 案例/views/v8_get
- POST属性
- QueryDict类型的对象
- 包含post请求方式的所有参数
- 与form表单中的控件对应
- 表单中空间必须有name属性,name为键,value为值
- checkbox存在一键多值的问题
- 键是开发人员定下来的,值是可变的
- 案例/views/v9_post
- settings中设置模板位置(已经设置完毕)
- 设置get页面的urls和函数
```python
# east/urls.py
# 需要在路由文件中添加两个路由
url(r'^v9_get/', views.v9_get),
url(r'^v9_post/', views.v9_post),
```
```python
# ShowViews/views.py
# 在文件中添加下面两个处理函数
def v9_get(request):
return render_to_response("for_post.html")
def v9_post(request):
rst = ""
for k,v in request.POST.items():
rst += k + "-->" + v
rst += ","
return HttpResponse("Get value of POST is {0} ".format(rst))
```
'''
#templates/for_post.html 新添了个包 templates, 需要在settings 配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
'''
- 添加文件/east/templates/for_post.html
- 由于安全原因,需要在设置中安全选项中删除csrf设置
```python
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 下面这句话被注释掉
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```