网站服务器怎么启动,基金会网站开发方案,如何购买云服务器,如何设公司产品购物网站目录
一、Web框架
二、WSGI协议
三、 Django框架
1、MVC与MTV模型
2、Django的下载与使用
补充
3、启动django项目
补充
5、 Django请求生命周期
四、路由控制
1、路由是什么#xff1f;
2、如何使用
3、path详细使用
4、re_path详细使用
5、反向解析
6、路由…目录
一、Web框架
二、WSGI协议
三、 Django框架
1、MVC与MTV模型
2、Django的下载与使用
补充
3、启动django项目
补充
5、 Django请求生命周期
四、路由控制
1、路由是什么
2、如何使用
3、path详细使用
4、re_path详细使用
5、反向解析
6、路由分发
五、视图层
1、格式
2、响应对象(本质上都是HttpResponse)
3、 CBV和FBV
4、关于类中self是谁的问题
5、上传文件 一、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服务器
wsgirefDjango框架默认就用它-------》性能低并发量低-------》测试阶段使用uwsgiC语言写的gunicornPython写的
协议到底怎么规定的
web服务器后面的python框架一定是一个可调用的对象必须接收两个参数(environ,start_response) environ它是个字典------》里面全是http请求的东西
使用wsgiref写个web服务
from wsgiref.simple_server import make_serverdef 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:dataf.read()elif environ.get(PATH_INFO) /login:with open(login.html, rb) as f:data f.read()else:databh1Hello, web!/h1return [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就是原来的MT 代表模板 (Template)负责如何把页面展示给用户(html)。 T就是原来的VV 代表视图View 负责业务逻辑并在适当时候调用Model和Template。 V路由是原来的C
2、Django的下载与使用
在命令行输入
pip uninstall djangopip3 install django3.2.20
pip uninstall django # 卸载
pip3 install django # 如果不指定就会装最新版本
创建项目
命令创建django-admin startproject 项目名 django-admin(会在python安装目录下的script文件夹多出一个可执行文件)使用pycharm创建 本质也是在执行这个命令编辑器帮咱们做了
目录结构 补充
python 解释器安装完 -----》有几个重要的文件和文件夹 根路径下 python.exe ---- 可以复制改名 -----》做多版本共存scripts文件夹pip命令在它下面后期咱们会装 第三模块[可能会有可执行文件可执行文件都放在这]Lib一堆文件夹中有py文件 python的解释器 有些代码是用c写的 字典列表有些代码是用python自己写的 使用语言自己写自己自举内置的模块自举的代码第三方包site-package---环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象它包含了一个或者多个应用程序所将使用到的信息。
环境变量的作用 当要求系统cmd运行一个程序而没有告诉它程序所在的完整路径时系统除了在当前目录(cmd当前的路径)下面寻找此程序外还应到path中指定的路径去找。用户通过设置环境变量来更好的运行进程。就是说将一个程序的位置加入到环境变量后回到命令窗口不管此时的cmd在任何目录下只要输入程序名不区分大小写不用带后缀.exe这个程序就会启动。较之前的每次运行不同程序都要切换路径的方式实在方便太多了。
3、启动django项目
python manage.py runserver 8001
这样我们的django就启动起来了当我们访问http://127.0.0.1:8080/时就可以看到 补充
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.1localhost具有更多的意义。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 的数据会被转发到本地应用。
5、 Django请求生命周期 四、路由控制
1、路由是什么
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表你就是以这种方式告诉Django对于客户端发来的某个URL调用哪一段逻辑代码对应执行。即请求路径和要执行的视图函数的对应关系。
2、如何使用
放在列表中urlpatterns [] ---- 列表中的数据必须是 path或re_path执行完的结果 path准确路径精准匹配---》以后基本都是pathre_path使用正则匹配---》就是原来的url---》使用非常少
3、path详细使用
path(admin/, login)
等价于_path(route, view, kwargsNone, nameNone)
第一个参数准确路径字符串
转换器 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,namelogin)
res reverse(login) # 当时定义路径传入的name参数对应的字符串
有转换器的情况
path(login/str:name, login,namelogin)
res reverse(login,kwargs{name:lqz}) # 当时定义路径传入的name参数对应的字符串
生成这种路径login/lqz1
6、路由分发
#主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)),
]在app01里创建一个urls
from django.urls import path,re_path
from app01 import views
urlpatterns [re_path(r^test/(?Pyear[0-9]{2})/$,views.url_test),
]五、视图层
views.py ----》这个文件目前写的是视图函数
1、格式
def 视图函数(request):return 四件套
2、响应对象(本质上都是HttpResponse)
HttpResponse ----》字符串render----》放个模板 ----》模板渲染是在后端完成 js代码是在客户端浏览器里执行的模板语法是在后端执行的redirect -----》重定向 字符串参数不是空的状态码是3开头JsonResponse---》json格式数据 return JsonResponse({name:kevin,age:19}) 本质是把传入的字典或列表(必须指定safeFalse)使用json序列化得到json格式字符 最终做成HttpResponse返回给前端如果想给json序列化的时候传参数必须使用json_dumps_params字典传入如果想往响应头中写数据 ----》需要传headers{xx:xx}
JsonResponse源码分析
return JsonResponse({name:kevin,age:19})
# 触发 JsonResponse的__init__---{name:kevin,age:19}给了data
def __init__(self, data, encoderDjangoJSONEncoder, safeTrue,json_dumps_paramsNone, **kwargs):# 如果传入的是字典# safe是True后面是False条件不符合内部就不会走if safe and not isinstance(data, dict):# isinstance(对象, 类) 判断这个对象是不是这个类的对象raise TypeError(In order to allow non-dict objects to be serialized set the safe parameter to False.)if json_dumps_params is None: # 条件符合json_dumps_params {}# kwargs是字典---》setdefault--》有则修改无则新增kwargs.setdefault(content_type, application/json)# 核心---》把字典转成json格式字符串赋值给datadata json.dumps(data, clsencoder, **json_dumps_params)# super().__init__ 调用父类的 __init__ 完成实例化---》HttpResponse的对象return HttpResponse(data,**kwargs)super().__init__(contentdata, **kwargs)
3、 CBV和FBV
FBV(Function base view)基于函数的视图
CBV(Class base view)基于类的视图
CBV经典写法
from django.views import View
class UserView(View):# 写方法---》跟请求方式同名的方法def get(self,request,*args,**kwargs)# 必须返回四件套
# 路由配置
path(index/, 视图类名.as_view()) # as_view是类的绑定方法
执行流程 ----》源码分析
path(index/, index), ---请求来了路由匹配成功会执行 index(request,)
path(index/, UserView.as_view()),
# 入口路由 ---》as_view来开始
# 请求来了路由匹配成功---》执行---》UserView.as_view()(request)
# 需要看as_view()执行结果是什么--》view--》代码如下:
def view(request, *args, **kwargs): # 方法可以加括号调用return self.dispatch(request, *args, **kwargs)
# 本质就是在执行 view(request)
# 本质在执行---》self.dispatch(request, *args, **kwargs)
# 去类UserViwe类中找找不到去父类View中找dispatch代码如下
def dispatch(self, request, *args, **kwargs):
request当次请求的请求对象取出请求方式【假设是get请求】转成小写 get
http_method_names [get, post, put]
条件成立执行if内部代码if request.method.lower() in self.http_method_names:getattr反射 ---》通过字符串去对象中取属性或方法self是谁的对象 是View这个类的对象这个是视图类UserView的对象取出来的handler是UserView这个类的get方法handler getattr(self, get)else:handler self.http_method_not_allowed# handler是 UserView这个类的get方法get(request)---》触发UserView这个类的get方法---》真正执行原来视图函数的内容# 最终返回return handler(request, *args, **kwargs)
总结
写cbv只需要在视图类中写跟请求方式同名的方法即可不同请求方式就会执行不同的方法
4、关于类中self是谁的问题
class Animal:def run(self):# 这个self是谁调用就是谁print(type(self)) # class __main__.Person# class __main__.Dogprint(self.name, 走路)class Person(Animal):def __init__(self, name):self.name nameclass Dog(Animal):def __init__(self, name, age):self.name nameself.age agep Person(kevin)
p.run() # kevin 走路dog Dog(小奶狗, 6)
dog.run() # 小奶狗 走路
总结
self是谁调用。self就是谁不能只看是哪个类
以后看到self.方法的时候不要只从当前类或父类中找应该先确定当前self是谁然后从这个对象的类根上开始找。
5、上传文件
关于模板查找路径是配置文件中
TEMPLATES ---DIRS: [os.path.join(BASE_DIR, templates)]
python
class FileView(View):def get(self,request):return render(request,file.html)def post(self,request):# 拿出文件对象my_filerequest.FILES.get(myfile)print(type(my_file))
# django.core.files.uploadedfile.InMemoryUploadedFile
# 跟之前用的文件对象不一样但是它应该继承了文件from django.core.files.uploadedfile import InMemoryUploadedFile# 1 保存 2 取出文件名字# my_file.save() # 找了一顿没有所以不能使用快捷保存方式需要自己写保存print(my_file.name) # 3-回顾django.md# 自己写保存,放在项目根路径下with open(my_file.name,wb) as f:for line in my_file:f.write(line)return HttpResponse(上传成功)
html
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title/head
body
form action methodpost enctypemultipart/form-datainput typefile namemyfilebrinput typesubmit value提交
/form
/body
/html