Python-Django框架笔记

工程目录结构

mysite/				外层目录,名字可以更改
	mysite/			工程目录,保存代码和文件
		__init__.py		一个将mysite定义为包和空文件
		settings.py 	部署和配置整个工程的配置文件(配置文件)
		urls.py		URL路由的声明文件(路由文件)
		wsgi.py		基于WSGI的Web服务器的配置文件
	manage.py		一个与Django工程进行交互的命令工具

调试工程:>python manage.py runserver

django框架开发流程:
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-admin命令:
	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与处理函数的关联

MTV开发模式

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对前面的信息进行格式定义
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Puzzle harvester

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值