本文介绍: Web框架(Web framework)是一种开发框架,用来支持动态网站网络应用网络服务开发。这大多数的web框架提供了一套开发和部署网站方式,也为web行为提供了一套通用的方法web框架已经实现了很多功能开发人员使用框架提供的方法并且完成自己业务逻辑,就能快速开发web应用了。浏览器服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用方法,大大提高了开发的效率。

一、Web框架

Web框架(Web framework)是一种开发框架,用来支持动态网站网络应用网络服务的开发。这大多数的web框架提供了一套开发和部署网站方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

即别人帮咱们写了一些基础代码 ——-》我们需要固定位置固定代码 ——》就能实现一个web应用
 

二、WSGI协议

简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件接收用户请求,从文件读取HTML,返回

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求解析HTTP请求发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范

正确的做法是底层代码由专门的服务器软件实现我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求响应格式,所以,需要一个统一接口协议实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI。

基于这个协议的web服务器

wsgiref:Django框架默认就用它——-》性能低,并发量低——-》测试阶段使用
uwsgi:C语言写的
gunicorn:Python写的
协议到底怎么规定的:

web服务器后面的python框架一定是一个可调用对象,必须接收两个参数(environ,start_response)
environ它是个字典——》里面全是http请求的东西
使用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框架

1、MVC与MTV模型

所有Web框架其实都遵循MVC架构

1.1 MVC:把本来坨在一起的代码拆到不同的位置

MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象数据库映射(ORM),视图负责用户交互(页面),控制器接受用户输入调用模型和视图完成用户请求

1.2 MTV

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:

M 代表模型(Model): 负责业务对象和数据库关系映射(ORM)。
M就是原来的M
T 代表模板 (Template):负责如何页面展示给用户(html)。
T就是原来的V
V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
V+路由是原来的C

2、Django下载与使用

命令行输入

pip uninstall django
pip3 install django==3.2.20

创建项目

目录结构

补充
python 解释器安装完 —–》有几个重要的文件文件
路径下  python.exe —-> 可以复制改名 —–》做多版本共存
scripts文件夹:pip命令在它下面,后期咱们会装 第三模块[可能会有可执行文件可执行文件都放在这]
Lib:一堆文件夹中有py文件
python解释器
有些代码是用c写的    字典列表
有些代码是用python自己写的 :使用语言自己写自己:自举
内置模块自举的代码
第三方sitepackage
环境变量
环境变量(environment variables)一般是指在操作系统用来指定操作系统运行环境的一些参数,如:临时文件位置系统文件夹位置等。

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到信息

环境变量作用
当要求系统cmd运行一个程序没有告诉它程序所在的完整路径时,系统除了在当前目录(cmd当前路径)下面寻找此程序外,还应到path指定路径去找。用户通过设置环境变量,来更好运行进程
就是说,将一个程序位置加入环境变量后,回到命令窗口,不管此时的cmd在任何目录下,只要输入程序名(不区分大小写,不用带后缀.exe),这个程序就会启动。较之前的每次运行不同程序都要切换路径方式,实在方便太多了。

3、启动django项目

python manage.py runserver 8001

补充
0.0.0.0和localhost和127.0.0.1有什么区别

1、0.0.0.0
严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。

表示的是一个集合:所有 不清楚 的主机和目的网络

“不清楚”:在本机路由表没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一律送进去。如果在网络设置设置了缺省网关,那Windows系统自动产生一个目的地址为0.0.0.0的缺省路由

用途:

一台主机没有分配一个IP地址时候用于表示主机本身。(DHCP分配IP地址时候
用作默认路由表示任意IPV4主机”,即当路由表没有找到完全匹配的路由的时候对应的路由。
用作服务端,表示本机上的任意IPV4地址。在服务端绑定端口的时候可以选择绑定到0.0.0.0,这样我的服务访问方就可以通过我的多个ip地址访问我的服务
用来表示目标机器不可用。
监听0.0.0.0的端口,来监听本机中所有IP的端口
2、127.0.0.1(一种本机保留的私有 IP)
本机地址,主要用于测试,即“我自己”。寻址这样一个地址,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包

127.0.0.1属于{127,}集合中的一个,而所有网络号为127的地址都被称之为环回地址,环回地址!== 127.0.0.1,它们是包含关系,即环回地址包含 127.0.0.1。

环回地址:所有发往该类地址的数据包应该loop back。所有发往目标IP为127.0.0.1的数据包都不会通过网卡发送网络上,而是在数据离开网络层时将其回送给本机的有关进程

用途:

环回测试通过使用ping 127.0.0.1 测试某台机器上的网络设备操作系统或者TCP/IP实现是否工作正常。
DDos攻击防御网站收到DDos攻击之后,将域名A记录到127.0.0.1,即让攻击者自己攻击自己。
部分Web容器测试的时候绑定的本机地址。
一般会通过ping 127.0.0.1来测试某台机器上的网络设备是否工作正常。
3、localhost

相比127.0.0.1,localhost具有更多的意义。localhost是个域名,而不是一个ip地址。可修改

用于指代 this computer 或者 this host可以用它来获取运行在本机上的网络服务

在大多数系统中,localhost指向了 IPV4 的 127.0.0.1 和 IPV6 的 ::1,这就是把localhost与127.0.0.1等同的原因

总结

0.0.0.0是一个特殊目的 IP 地址,称作不可路由 IP 地址,它的用途会被特殊规定。通常情况下,当我们把一个服务绑定到0.0.0.0,相当于把服务绑定任意的 IP 地址。比如一台服务器上有多个网卡,不同网卡连接不同的网络,如果服务绑定到 0.0.0.0 就可以保证服务在多个 IP 地址上都可以用。
localhost指代的是本地计算机用于访问绑定在 loopback 上的服务。localhost 是一个主机名,不仅仅可以指向 IPv4 的本地回环地址,也可以指向 IPv6 的本地回环地址 [::1]。
127.0.0.1是本地回环地址(loopback),发送到 loopback数据会被转发本地应用。
 

 4、Django请求生命周期

四、路由控制 

1、路由是什么
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。即请求路径和要执行的视图函数对应关系

2、如何使用
放在列表中:urlpatterns = [] —-> 列表中的数据,必须是 pathre_path执行完的结果
path:准确路径,精准匹配—》以后基本都是path
re_path:使用正则匹配—》就是原来的url—》使用非常少
3、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是给视图函数传递默认参数

第四个参数:路径的别名 —–》后期使用反向解析得到该路径

4、re_path详细使用
跟path除了第一个参数不一样,其他完全一样
第一个参数是:正则表达式
后期用的很少,危险性大 —–》原来之所以支持正则的目的是为了分组出参数
path通过转换器能完成这个操作 —-》于是这个几乎不用
5、反向解析
在使用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'1

路由分发

#主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/&amp;',include('app01.urls')),#不行
  # path('app01/',include('app01.urls')),#行 
  #path('app01/', include(urls)),
]

五、视图层

1、格式

def 视图函数(request):
    return 四件套

2、request对象

request.path
request.method
request.GET
requets.POST
requets.body
request.get_full_path()  # 方法
request.files   # 前端携带文件过来—》转成了字典,根据文件的名字取到文件对象

不常用的

request.cookie
request.session
request.content_type  # 提交编码格式urlencoded(form表单),jsonformdatatext/plain(一般不用,浏览器默认格式)
request.META: 请求头中得数据
     useragent:HTTP_USER_AGENT
     referer:
     客户端ip地址:REMOTE_ADDR
     用户自定义的  
           定义:name=lqz
           取:request.META.get(‘HTTP_NAME’)  # 前面加HTTP_ 把自定义的转成大写
request.user  # auth
request.is_ajax() 

 

原文地址:https://blog.csdn.net/weixin_41774149/article/details/134677238

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_28254.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注