day66
今日回顾内容
web框架
django
路由控制
视图层
web框架
一、什么是web框架
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。
1.1 wsgiref模块
WSGI(Web Server Gateway Interface,web服务器网关接口)主要规定了服务器端和应用程序之间的接口,即规定了请求的URL到后台处理函数之间的映射该如何实现。wsgiref是一个帮助开发者开发测试的Python内置库,程序员可以通过这个库了解WSGI的基本运行原理,但是不能把它用在生产环境上。
1.2 使用wsgiref写个web服务
from wsgiref.simple_server import make_server
def mya(environ, start_response):
print(environ)
start_response('200 OK', [('Content-Type', 'text/html')])
if environ.get('PATH_INFO') == '/index':
with open('index.html','rb') as f:
data=f.read()
elif environ.get('PATH_INFO') == '/login':
with open('login.html', 'rb') as f:
data = f.read()
else:
data=b'<h1>Hello, web!</h1>'
return [data]
# 可调用对象---》能加括号执行的对象
if __name__ == '__main__':
myserver = make_server('', 8011, mya) # 请求来了---》经过wsgiref---》调用后面的可调用对象--》传入两个参数(environ, start_response)
print('监听8011')
myserver.serve_forever()
Django
一、MVC与MTV模型
1.1、MVC
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求。
1.2、MTV
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
- M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
- T 代表模板 (Template):负责如何把页面展示给用户(html)。
- V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template。
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
二、Django的下载与基本命令
1.1、下载Django
方式一:在命令行输入:pip3 install django
pip install django==3.2.12 -i http://pypi.hustunique.org/simple 指定版本号,指定国内镜像
方式二:用pycharm安装
方式三:用pycharm的Terminal的命令行安装
1.2、创建一个django project
django-admin startproject 项目名
python manage.py startapp 应用名
python manage.py runserver 127.0.0.1:8080 # 启动django
1.3、Django目录结构
1.4、Django的请求生命周期
路由控制
一、什么是路由
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行
请求路径和要执行的视图函数的对应关系
1.1、如何使用
path:准确路径,精准匹配---》以后基本都是path
re_path---》就是原来的url---》正则匹配---》非常少
放在列表中:urlpatterns = []--->列表中得数据,必须是 path或re_path执行完的结果
1.2、path的详细使用
path('admin/', login)---》
等价于:_path(route, view, kwargs=None, name=None)
第一个参数:
准确路径,字符串
转换器: '<int:pk>' '<str:name>'
-127.0.0.1:8080/login/justin---->path('login/<str:name>', admin.site.urls),
-视图函数中 def login(request,name)
第二个参数: 视图函数的内存地址 不要加括号
-路由一旦匹配成功,就会执行 你写的这个视图函数(request),并且会把request对象传入
-如果有分组的参数[有名,无名],或者转换器的参数,都会被传递到视图函数中作为参数
-总结:放要放视图函数地址---》但是视图函数的参数:第一个是固定必须是request,后续的取决于写没写转换器,写没写有名无名分组
第三个参数:kwargs 是给视图函数传递默认参数
第四个参数:路径的别名---》后期使用反向解析得到该路径
1.3、re_path的详细使用
跟path除了第一个参数不一样,其他完全一样
第一个参数是:正则表达式
后期用的很少,危险性大---》原来之所以支持正则的目的是为了分组出参数
path通过转换器能完成这个操作--》于是--》这个几乎不用
二、反向解析
在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
-没有转换器的情况:
path('login/', login,name='login')
res=reverse('login') #当时 定义路径传入的name参数对应的字符串
-有转换器的情况:
path('login/<str:name>', login,name='login')
res=reverse('login',kwargs={name:lqz}) #当时 定义路径传入的name参数对应的字符串
生成这种路径:'login/lqz
三、路由分发
#主urls
from django.urls import path,re_path,include
from app01 import views
from app01 import urls
urlpatterns = [
# re_path(r'^app01/',include('app01.urls')),#行
# re_path(r'^app01/&',include('app01.urls')),#不行
# path('app01/',include('app01.urls')),#行
#path('app01/', include(urls)),
]
在应用中创建一个urls
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^test/(?P<year>[0-9]{2})/$',views.url_test),
]
视图层
一、视图函数
一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py
的文件中。
视图函数必须写成这样
def 视图函数(request):
return 四件套
1.1、request对象
它是http请求(数据包---》字符串形式)---》拆分成了django中得request对象
常用的:
request.path 一个字符串,表示请求的路径,不包括域名或者站点根 URL 的路径。
request.method 一个字符串,表示 HTTP 请求的方法。常见的值有 "GET","POST" 等。
request.GET 一个类似字典的对象,包含所有的 GET 参数。
requets.POST 一个类似字典的对象,包含所有的 POST 参数。
requets.body http请求的主体,二进制格式。
request.get_full_path() # 方法
request.files 一个类似字典的对象,包含所有的上传文件
不常用
request.cookie 一个字典,包含所有的 cookie。键和值都为字符串。
request.session
request.content_type # 提交的编码格式:urlencoded(form表单),json,form-data,text/plain(一般不用,浏览器默认的格式)
request.META: 请求头中得数据
user-agent:HTTP_USER_AGENT
referer:
客户端ip地址:REMOTE_ADDR
用户自定义的
定义:name=lqz
取:request.META.get('HTTP_NAME') # 前面加HTTP_ 把自定义的转成大写
-request.user # auth
-request.is_ajax()