mysite/ 外层目录,名字可以更改
mysite/ 工程目录,保存代码和文件
__init__.py 一个将mysite定义为包和空文件
settings.py 部署和配置整个工程的配置文件(配置文件)
urls.py URL路由的声明文件(路由文件)
wsgi.py 基于WSGI的Web服务器的配置文件
manage.py 一个与Django工程进行交互的命令工具
调试工程:>python manage.py runserver
(1)新建工程:\>django-admin startproject mysite
(2)修改工程:
(2.1)创建一个具体应用(app):\>python manage.py startapp [app名字]
(2.2)修改应用的views.py:对URL的具体响应功能
(2.3)修改URL路由:指定URL与响应之间的关系
(3)运行工程:\>python manage.py mysite
Django框架全局的管理工具
使用方式:\>django-admin <command> [options]
功能:
建立并管理Django工程
建立并管理Django工程使用的数据库
控制调试或日志信息
运行并维护Django工程
更多功能:\>django-admin help
manage.py:
对Django工程管理的工具(只针对当前工程)
使用方式:\>python manage.py <command> [options]
查看功能:\>python manage.py help
path()函数:
定义:path( route,view, kwargs=None, name=None),
route:URL或URL模式,Django定义的URL转换语法
view:处理(视图)函数的名称,或include()类
kwargs:向处理函数提供的额外参数,以字典形式表示
name:给URL模式的命名
例如:path('index/',views.hello),
路由:URL与处理函数的关联
M:Models模型 --数据
与数据组织相关的功能
组织和存储数据的方法和模式,与数据模型相关的操作。
T:Templates模板 --样式
与表现相关的所有功能
页面展示风格和方式,与具体数据分离,用于定义表现风格。
V:Views视图 --处理
针对请求选取数据的功能
选择哪些数据用于展示,指定显示模板,每个URL对应一个回调函数。
render()函数:
打包函数
定义:render(参数1,参数2[, 参数3])
参数1:request
参数2:页面
参数3:字典类型
例如:render(request,"PYC01-HTMLJSDemo.html")
使用"PYC01-HTMLJSDemo.html"为返回页面。
例如:
需求:返回一个HTML页面,而不是一个字符串
思路:建立模板(T),对应特定请求,返回模板页面
步骤2-1:新建hello2app应用:\>python manage.py startapp hello2app
步骤2-2:修改应用的views.py
使用"PYC01-HTMLJSDemo.html"为返回页面,修改views.py:render(request,"PYC01-HTMLJSDemo.html")
步骤2-3:新增urls.py文件
在hello2app应用中,新增urls.py文件(本地路由文件)<局部路由>
步骤2-4:增加对本地路由的引用(如果不增加对本地路由的引用,则本地路由毫无意义)
在全局路由文件中增加对本地路由的引用:path('index2/', include('hello2app.urls')), # 用户访问indesx2时,使用本地路由进行解析
步骤2-5:设置模板路径
设置模板路径,让Django框架找到模板所在目录
'DIRS': [os.path.join(BASE_DIR, 'hello2app/templates')],
os.path.join将后面两个路径进行合并
BASE_DIR:当前工程的主路径
include()函数,用于引入其他路由文件
云端留言板基本功能定义:
云端留言板基本功能定义:
提交留言功能:
用户设定自己的名字为A,指定任意名字B向B留言,记为msg,留言保存在云端
获取留言功能:
输入名字A,云端返回10条最新留言记录
云端留言板开发流程
步骤1:新建工程 cloudms
步骤2-1:新建应用 msgapp
步骤2-2:增加模板,即显示界面的HTML/CSS/JS代码,配置路径
步骤2-3:设定URL路由,本地路由和全局路由
步骤2-4:编写交互代码
步骤3:运行工程
Django的URL路由配置:
settings.py文件中ROOT_URLCONF变量指定全局路由文件名称:
ROOT_URLCONF='<工程名称>.urls' # 默认对应工程目录下urls.py文件
Django使用urlpatterns变量表示路由(urls.py),该变量是列表类型,由path()或re_path()作为元素组成
Django的URL路由流程:
Django查找全部urlpatterns变量(urls.py)
按照先后顺序,对URL逐一匹配urlpatterns每个元素
找到第一个匹配时停止查找,根据匹配结构执行对应处理函数
如果没有找到匹配或出现异常,Django进行错误处理
注意:
Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即,只需要URL相同,无论POST,GET等那种请求方式都指向同一个操作函数
路由:path()和re_path()
path()处理字符串路由:path( route, view ) route:URL字符串 view:处理函数
re_path()处理正则表达式路由:re_path( route, view ) route:正则表达式(正则表达式可以看作字符串的模式)view:处理函数
Django支持三种方式表达route:
精确字符串格式:articles/2003/
一个精确URL匹配一个操作函数
最简单形式,适合对静态URL的响应
URL字符串不以/开头,但要以/结尾
Django的转换格式:<类型:变量名>, articles/<int:year>/
一个URL模板,匹配URL同时在其中获得一批变量作为参数
常用形式,目的是通过URL进行参数获取和传递
采用<类型:变量名>格式获取参数
正则表达式格式:articles/(?P<year>[0-9]{4})/
借助正则表达式丰富语法表达一类URL(不是一个)
可以通过<>题取变量作为处理函数的参数,高级用法
使用re_path()函数 articles/([0-9]{4})/
使用re_path()函数,两种具体形式:
简单形式(pattern),不题取参数:articles/([0-9]{4})/ # 0-9作为字符,总共4个字符
命名形式(?P<name>pattern),题取参数,统一为str类型:
article/(?P<year>[0-9]{4})/
Django的转换格式:
str:匹配除分隔符(/)外的非空字符串,默认类型<year>等价于<str:year>
int:匹配0和正整数
slug:匹配字母、数字、横杠、下划线组成的字符串,str的子集
uuid:匹配格式化的uuid,如:075194d3-6885-417e-a8a8-6c931e272f00
path:匹配任何非空字符串,包括路径分隔符,是全集
view的使用:
view包括两种类型:处理函数和include()函数
处理函数:views.py中处理URL的对应函数,URL处理的归宿
include()函数:包含其他路由信息的函数,分段路径组合形成总路径
include()用法:(1)附加本地路由;(2)路由去重
URL根目录的处理:
http://127.0.0.1:8000/ 的响应
例如:
# 全局urls.py文件
urlpatterns = [
path('', <根目录处理函数>),
re_path('^$', <根目录处理函数>), # 或者,二选一
]
视图函数编写原则:
视图函数接收HTTP请求并返回响应,可以放在任何地方,可以是任何功能
视图函数可以返回Web文本、页面、重定向、错误、图片等任何内容
视图函数通过HttpResponse、JsonResponse等类表达并返回响应
按约定,视图函数放在对应app中的views.py文件中
Django的响应类型:
HttpResponse类及子类(共10个)
JsonResponse类
StreamingHttpResponse类
FileResponse类
HttpResponse类及子类:
HttpResponse: 主要反馈类型,父类,HTTP状态码默认为200
HttpResponseRedirect: 重定向,HTTP状态码为302
HttpResponsePermanentRedirect: 永久重定向,HTTP状态码为301
HttpResponseNotModifed: 网页无改动,该类型无任何参数,HTTP状态码为304
HttpResponseBadRequest: 不良响应,HTTP状态码为400
HttpResponseForbidden: 禁止访问,HTTP状态码为403
HttpResponseNotAllowed: 不被允许,HTTP状态码为405
HttpResponseGone: HTTP状态码为410
HttpResponseServerError: 服务器错误,HTTP状态码为500
HttpResponseNotFound: 404错误,HTTP状态码为404
HttpResponse(content, content_type=None, status=200, charset=None)
content:拟返回的字符串
content_type:MIME格式的返回内容类型
status:响应状态码
charset:响应的字符
JsonResponse类:
JsonResponse( data )
data:字典类型,返回的JSON类型数据
StreamingHttpResponse类:
StreamingHttpResponse(streaming_content)
streaming_content:内容的迭代器形式,以内容流的方式响应
FileResponse类:
FileResponse(stream)
stream:以流形式打开后的文件
Django请求类型的判断:
django.views.decorators.http
路由不能判断HTTP请求的类型
Django通过decorators在视图函数前进行基本判断,格式如下:
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def my_view(request):
# I can assume now that only GET or POST requests make it this far
# ...
pass
Django的响应类型:
一次性响应vs流式响应
一次性响应:我们将需要响应的信息一次性发给用户
HttpResponse类及子类
JsonResponse类
流式响应:将需要反馈给用户的信息,采用流的形式逐步反馈给用户
SteamingHttpResponse类:适用于大文本文件传输
FileResponse类:适用于大二进制文件传输
实列:文件下载
(1)HttpResponse方式:文件内容一次性响应,仅适合小文件
def file_download(request):
# do something...
with open('data.txt') as f:
c = f.read()
return HttpResponse(c)
(2)StreamingHttpresponse方式:
步骤:
将文件分段,每次传输一部分,分段大小可调
利用python的迭代器产生分段
可以是文件,也可以是任何大规模数据响应
代码:
from django.http import StreamingHttpResponse
def big_file_download(request):
# do something...
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
fname = "data.txt"
response = StreamingHttpResponse(file_iterator(fname))
return response
(3)FileResponse方式:FileResponse是StreamingHttpResponse的子类
自动分段、自动迭代,适合二进制文件传输
def homeproc2(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/1.png", "rb"))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="1.png"'
return response
MIME标记:
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="1.png"'
Content-Type用于指定文件类型
Content-Disposition用于指定文件下载的默认名称
这两者是MIME类型的标准定义
模板引擎的配置:
settings.py文件中对模板引擎进行配置(BACKEND)
模板目录(DIRS)在列表中的顺序是搜索模板的顺序
模板的查找:
get_template(template_name) -> Template类
template_name:待查找模板的名称
在模板目录列表中,依次查找某个模板,直到找到并返回Template类
如果未找到模板,则抛出TemplateDoesNotExist异常
select_template(template_name_list) -> Template类
template_name_list:待查找模板的名称列表
与get_template()相似,一次按照模板列表查找某个模板,直到找到第一个并返回Template类,未找到则抛出TemplateDoesNotExist异常
模板的渲染:
Template.render(context, request) -> HTML字符串
context:字典类型,用于加载到模板中的内容
request:HTTP请求
在模板目录列表中,一次查找某个模板,直到找到并返回Template类
如果未找到模板,则抛出TemplateDoesNotExist异常
模板语言:
注释:comment
单行注释:{# 这是单行注释 #}
多行注释:{% comment %}
这是多行注释第一行
这是多行注释第二行
{% endcomment %}
变量:variable
{{ name }}
如果变量本身是字典类型、列表类型或对象,用’.‘获取元素
{{ adict.key }}:adict字典类型
{{ alist.0 }}:alist列表,第0个值
{{ aobject.attribute }}:aobject对象
标签:tags
{% 关键字引导的程序逻辑 %}
标签中的关键字包括:
for, endfor, block, endblock, if, elif, else, endif, in ,trans, as, with ,extends 等
过滤器:filter
{% name|过滤标签 %} {% name|f1|f1 %}
过滤器对变量的值进行修饰
lower, escape, linebreaks, date, length等
例如: {{ name|lower }} 表示对前面变量值中所有字符进行小写处理
{{ my_date|date:"Y-m-d" }} date对前面的信息进行格式定义