视图介绍和项目准备
# 视图的第一个参数必须为HttpRequset对象,
- 通过正则表达式组获取的位置参数
- 通过正则表达式组获得的关键字参数
# 视图必须返回一个HttpResponse对象或子对象作为响应
- 子对象:JsonResponse HttpResponseRedirect
# 视图负责接受Web请求HttpRequest,进行逻辑处理返回响应HttpResponse给请求者
- 响应内容可以是HTML内容,404错误,重定项,json数据
项目准备
- 创建项目+创建应用+安装应用+配置模板路径+本地化+mysql数据库+URLconf+视图
URLconf
1.settings.py中指定url配置
ROOT_URLCONF = “项目.urls”
2.项目中urls.py
url(正则, include('应用.urls'))
3.应用中urls.py
url(正则, views.函数名)
位置参数:参数的位置不能错
url(r'^(\d+)/(\d+)/$', views.index),
关键字参数:参数的位置可以变,跟关键字保持一致即可
url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),
错误视图
404错误:page not found视图
- url匹配不成功会发生404错误
400错误:bad request视图
- 来自客户端的安全方面非法操作会引发400错误
500错误:server error视图
- 在视图中代码运行报错会发生500错误
# 只需要在模板中定义指定html文件即可,不需要配置URLconf和准备视图,但是要配置模板加载路径
DEBUG = False # 线上模式 Django不在提供静态文件的处理,因为Django擅长处理动态逻辑,静态处理交给nginx服务器处理
ALLOWED_HISTS = ['*']
HttpRequest对象
- HttpRequest对象属性几乎都是只读的,用于读取请求报文,不是用来设置请求报文的
path:一个字符串,表示请求的页面的完整路径,不包含域名
method:一个字符串,表示请求使用的HTTP方法,常用值包括:GET、POST
GET:一个类似于字典的QueryDict对象,含get请求方式的所有参数,?后面的内容
POST:一个类似于字典的QueryDict对象,含post请求方式的所有参数
FILES:一个类似于字典的QueryDict对象,包含所有的上传文件
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
encoding:一个字符串,表示提交的数据的编码方式
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用
* 定义在django.http.QueryDict中
* HttpRequest对象的GET、POST属性都是QueryDict类型的对象
* QueryDict类型的对象可以用来处理同一个键带有多个值的情况
* QueryDict类型的对象,键和值都是字符串类型
- 键是开发人员在编写代码时确定下来的
- 值是根据数据生成的
* 注意:QueryDict类型的对象不是字典,仅仅是类似字典的对象而已
- 相关方法
get(): 根据键获取值
- 如果一个键同时拥有多个值将获取最后一个值
- 如果键不存在则返回None值,可以设置默认值进行后续处理
dict.get('键',默认值)
可简写为
dict['键']
getlist():根据键获取值,值以列表返回,可以获取指定键的所有值
- 如果键不存在则返回空列表[],可以设置默认值进行后续处理
dict.getlist('键',默认值)
* get请求时url格式,在请求地址结尾使用?,之后以“键=值”的格式拼接,多个键值对之间以&连接
一键一值
http://127.0.0.1:8000/get/?a=10&b=20&c=python
一键多值
http://127.0.0.1:8000/get/?a=10&b=20&a=python
* 使用form表单提交请求时,method方式为post则会发起post方式的请求
* 在django.http模块中定义了HttpResponse对象的API
* HttpRequset对象有Django创建,HttpResponse对象由开发人员创建
content: 表示返回的内容
charset: 表示response采用的编码字符集,默认utf-8
status_code: 返回的HTTP响应状态码
content_type: 指定返回数据的MIME类型,默认'text/html'(text/plain, text/xml, application/json)
init: 创建HttpResponse对象后完成返回内容的初始化
write: 向响应体中写数据
set_cookie: 设置Cookie信息
set_cookie('key', 'value', 'max_age=None', expires=None)
delete_cookie: 删除指定的key的Cookie,如果key不存在则什么也不发生
delete_cookie('key')
render()函数和HttpResponse()函数都是返回数据给请求者
render()函数封装主要三个步骤
1.定义上下文
2.该函数就是让模板语言去执行
- JsonResponse 继承自HttpResponse,被定义在django.http模块中,接收字典作为参数(也可以接收列表作为参数)
- 使用场景:当需要响应json数据给请求者,需要用到JsonResponse,响应内容格式默认json
- JsonResponse的content_type默认为application/json
1.准备URLconf,视图,模板
2.导入 jquery 静态文件
3.发起ajax请求
4.响应json字典
5.处理json字典,构造html内容
- 前提:当服务器处理完某种逻辑,不需要用户点击界面,即可把该响应交给浏览器,浏览器收到该响应,读取响应当中的地址信息,最后跳转到响应当中的地址
-点击登录按钮的本质,不是跳转界面,是将登陆表单信息发送给服务器,服务器处理登陆成功,响应重定向给浏览器,浏览器自动跳转页面
- 从一个视图转到另外一个视图(本质是视图的请求地址),就是重定向,继承自HttpResponse,被定义在django.http模块中,返回状态码302
- HttpResponseRedirect 、 redirect(2个同级)
状态保持
- 浏览器请求服务器是无状态
- 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
- 无状态原因:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。
- 实现状态保持两种方式:在客户端存储信息使用Cookie;在服务器端存储信息使用Session
# Cookie
## key = value 的字符串
- Cookie:指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地的数据(通常经过加密)
- 应用:判定注册用户是否已经登录网站。网站的广告推送。购物车
- Cookie基于域名安全,不同域名的Cookie是不能互相访问的
设置Cookie
response.set__cookie('mark','hello')
读取Cookie
c= request.COOKIES['mark']
判断是否存在某个Cookie
if request.COOKIES.has__key('mark')
删除Cookie
response.delete__cookie('mark')
# Session
## 默认session都已经准备好了可以直接使用
- 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中
- 在服务器端进行状态保持的方案就是Session
- Session依赖于Cookie
## Session存储
- Django默认启用Session,禁用就是将Session中间件注释即可
- 可以存储在数据库、缓存、Redis等,SESSION_ENGINE指定Session存储方式
存储在数据库(默认存储方式可不写)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
存储在缓存中,丢失则不能找回,比数据库的方式读写更快
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
混合存储:优先从本机内存中存取,如果没有则从数据库中存取
SESSION_ENGINE = 'django.contrib.sessions.backends.cache_db'
## Session操作
- 通过Session属性进行回话读写操作,以键值对的格式操作
设置Session
# 先把状态保持的信息,写入到django_session表,再把该数据生成一个cookie信息,写入到浏览器
request.session['键'] = 值
读取Session
request.session.get('键', 默认值)
删除指定键的值,在存储中只删除某个键对应的值
del request.session['键']
清除所有键的值,在存储中删除所有键对应的值
request.session.clear()
清除Session数据,在存储中删除所有键及对应的值,形成空表
request.session.flush()
设置回话的超时时间(默认2周)
request.session.set_expirt(value)
如果value是一个整数,会话将在value秒没有活动后过期
如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
如果value为None,那么会话则两个星期后过期
配置流程
django-admin startproject 项目名称
cd BookManager/
python manage.py startapp 应用名称
/home/python/.virtualenvs/py3_django/bin/python
python manage.py runserver
python manage.py makemigrations
python manage.py migrate
LANGUAGE_COOE="zh-Hans"
TIME_ZONE="Asia/Shanghai"
python manage.py createsuperuser
url(r'^', include('Book.urls')),
url(r'^booklist/$', bookList),
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Bookdb',
'HOST': '192.168.80.132',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'mysql',
}
}
"DIRS":[os.path.join(BASE_DIR, "templates")]
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
DEBUG = False
ALLOWED_HISTS = ['*']