web 应用程序的本质:
1、接收并解析HTTP请求,获取具体的请求信息
2、处理本次的HTTP请求,即完成本次请求的业务逻辑处理
3、构造并返回处理结果 —— HTTP响应
特点:
1、提供项目工程管理的自动化脚本工具
2、数据库orm支持(对象管理映射)
3、模板
4、表单
5、Admin管理站点
6、文件管理
7、认证权限
8、session机制
9、缓存
MVT模式:
核心思想:分工、解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。(高聚合,低耦合)
django-admin startproject 工程名称
运行服务器的命令:
python manage.py runserver (ip:端口)
ip和端口可省略,默认为:127.0.0.1,:8000
1、 python manage.py startapp 子应用名称(此时manage.py是创建工程时自动生成的管理文件)
文件类型说明:
视图函数的第一个传入的参数必须定义,用于接受Django构造的包含了请求数据的HttpReqeust对象,通常名为request。
1、BASE_DIR:BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file))),当前工程的根目录,Django会依此来定位工程内的相关文件,我们也可以使用该参数来构造文件路径。
2、DEBUG:线上运行时不能在此模式下运行,修改为Flase, Django在调试模式下默认不提供静态文件服务
3、本地语言与时区:简体中文和上海
为提供静态文件,需要配置两个参数
STATICFILES_DIRS 存放查找静态文件的目录
STATIC_URL 访问静态文件的URL前缀
步骤:
1、路由定义位置
两种方式:
Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。
每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存该应用的路由。然后用主路由文件包含各应用的子路由数据
也可将工程的全部路由信息都定义在主路由文件中,子应用不再设置urls.py
2、路由解析顺序
Django在接收到一个请求时,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行查询。值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期结果。
3、 路由命名
5、路径结尾斜线/的说明
在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。
在创建应用时,Django会向apps.py文件中写入一个该应用的配置类
我们将此类添加到工程settings.py中的INSTALLED_APPS列表中,表明注册安装具备此配置属性的应用。
AppConfig.name 属性表示这个配置类是加载到哪个应用的,每个配置类必须包含此属性,默认自动生成。
AppConfig.verbose_name 属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示:class UsersConfig(AppConfig):
name = ‘users’
verbose_name = ‘用户管理’
向服务器传参的几种路径:
提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
查询字符串(query string),形如key1=value1&key2=value2;
请求体(body)中发送的数据,比如表单数据、json、xml;
在http报文的头(header)中。
1、url路径参数
2、Django中的QueryDict对象
3、查询字符串Query String
获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。:例如:
#/qs/?a=1&b=2&a=3
def qs(request):
a = request.GET.get(‘a’)
b = request.GET.get(‘b’)
alist = request.GET.getlist(‘a’)
print(a) # 3
print(b) # 2
print(alist) # [‘1’, ‘3’]
return HttpResponse(‘OK’)
注意:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。
4、请求体
可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE
Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件
import json
def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 无需执行此步
req_data = json.loads(json_str)
print(req_data[‘a’])
print(req_data[‘b’])
return HttpResponse(‘OK’)
5、请求头:
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型
6、其他常用的HttpRequest对象属性
method:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’。
user:请求的用户对象。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
encoding:一个字符串,表示提交的数据的编码方式。
如果为None则表示使用浏览器的默认设置,一般为utf-8。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
FILES:一个类似于字典的对象,包含所有的上传文件。
HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。
HttpResponse
1、可以使用django.http.HttpResponse来构造响应对象。
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
2、也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码
例如:
from django.http import HttpResponse
def demo_view(request):
return HttpResponse(‘itcast python’, status=400)
或者
response = HttpResponse(‘itcast python’)
response.status_code = 400
response[‘Itcast’] = ‘Python’
return response
HttpResponse子类
JsonResponse
若要返回json数据,可以使用JsonResponse来构造响应对象
作用:帮助我们将数据转换为json字符串
设置响应头Content-Type为 application/json
redirect重定向
设置cookie:通过HttpResponse对象中的set_cookie方法,HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
response.set_cookie(‘itcast1’, ‘python1’) # 临时cookie
response.set_cookie(‘itcast2’, ‘python2’, max_age=3600) # 有效期一小时
读取Cookie
可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。
Django项目默认启用Session。
类视图的好处:
代码可读性好
类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可
可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
- 定义方法:定义一个中间件工厂函数,然后返回一个可以被调用的中间件中间件工厂函数需要接收一个可以调用的get_response对象。返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象
orm:django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
使用django进行数据库开发的步骤:
Django默认使用sqlite数据库,
模型类被定义在"应用/models.py"文件中。
模型类必须继承自Model类,位于包django.db.models中
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
在templates目录中创建一个模板文件,如:index.html
Django提供了一个函数render:render(request对象, 模板文件路径, 模板数据字典)
from django.shortcuts import render
def index(request):
context={‘city’: ‘北京’}
return render(request,‘index.html’,context)