Django

一 什么是web框架

框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。

web应用的流程:

1.浏览器发送一个HTTP请求;2.服务器收到请求,生成一个HTML文档;3.服务器把HTML文档作为HTTP响应的Body发送给浏览器;4.浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

import socketdef handle_request(client):buf = client.recv(1024)client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))client.send("<h1 style='color:red'>Hello, yuan</h1>".encode("utf8"))def main():sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(('localhost',8001))sock.listen(5)while True:connection, address = sock.accept()handle_request(connection)connection.close()if __name__ == '__main__':main()

简化的服务端

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

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

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

这个接口就是WSGI:Web Server Gateway Interface。

例1:wsgi简单上手

from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8080...')
# 开始监听HTTP请求:
httpd.serve_forever()

用浏览器访问:

注意:

整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,

我们只负责在更高层次上考虑如何响应请求就可以了。

application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。

Python内置了一个WSGI服务器,这个模块叫wsgiref

application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

//environ:一个包含所有HTTP请求信息的dict对象;

//start_response:一个发送HTTP响应的函数。

在application()函数中,调用:

start_response('200 OK', [('Content-Type', 'text/html')])

就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()函数。

start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。

通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。

然后,函数的返回值b'<h1>Hello, web!</h1>'将作为HTTP响应的Body发送给浏览器。

有了WSGI,我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML,通过start_response()发送Header,最后返回Body。

例2:wsgi简单实现返回html给浏览器

from wsgiref.simple_server import make_serverdef application(environ, start_response):# start_response('200 OK', [('Content-Type', 'text/html')])print(environ['PATH_INFO'])path = environ['PATH_INFO']start_response('200 OK', [('Content-Type', 'text/html')])f1 = open("index1.html", "rb")data1 = f1.read()f2 = open("index2.html", "rb")data2 = f2.read()if path == "/test1":return [data1]elif path == "/test2":return [data2]else:return ["<h1>404</h1>".encode('utf8')]return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8080...')
# 开始监听HTTP请求:
httpd.serve_forever()

print(environ['PATH_INFO'])的结果为:

/test1
/favicon.ico

例3:将例2功能函数解耦

from wsgiref.simple_server import make_serverdef f1():f1=open("index1.html","rb")data1=f1.read()return [data1]def f2():f2=open("index2.html","rb")data2=f2.read()return [data2]def application(environ, start_response):print(environ['PATH_INFO'])path=environ['PATH_INFO']start_response('200 OK', [('Content-Type', 'text/html')])if path=="/test1":return f1()elif path=="/test2":return f2()else:return ["<h1>404</h1>".encode("utf8")]httpd = make_server('', 8080, application)print('Serving HTTP on port 8080...')# 开始监听HTTP请求:
httpd.serve_forever()

例4:模拟数据库交互

from wsgiref.simple_server import make_serverdef f1(req):print(req)print(req["QUERY_STRING"])f1=open("index1.html","rb")data1=f1.read()return [data1]def f2(req):f2=open("index2.html","rb")data2=f2.read()return [data2]import timedef f3(req):        #模版以及数据库
f3=open("index3.html","rb")data3=f3.read()times=time.strftime("%Y-%m-%d %X", time.localtime())data3=str(data3,"utf8").replace("!time!",str(times))return [data3.encode("utf8")]def routers():urlpatterns = (('/test1',f1),('/test2',f2),("/time",f3))return urlpatternsdef application(environ, start_response):print(environ['PATH_INFO'])path=environ['PATH_INFO']start_response('200 OK', [('Content-Type', 'text/html')])urlpatterns = routers()func = Nonefor item in urlpatterns:if item[0] == path:func = item[1]breakif func:return func(environ)else:return ["<h1>404</h1>".encode("utf8")]httpd = make_server('', 8080, application)print('Serving HTTP on port 8080...')# 开始监听HTTP请求:

httpd.serve_forever()

代码中!time!替换index3.html中的!time!部分,这其实就一个简化的模板语言,我们在不知不觉中已经写出一个web框架了。

转载于:https://www.cnblogs.com/hujq1029/p/6098300.html

Django基础之wsgi相关推荐

  1. python路由编程_Python Django基础二之URL路由系统

    MVC和MTV框架 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  2. 1,Django 基础一

    Django 基础 基础知识: 1,什么是web应用? web本质就是一个socket服务端,用户的浏览器就是一个socket客户端,基于c/s架构的b/s软件开发架构的应用 浏览器中敲入网址回车发送 ...

  3. Django基础--4

    补充知识-路由系统(URL) URL传递额外的参数 在url.py里,除了默认会传一个request给处理函数,还可以传递额外的参数,把一个字典作为第三个参数传入,之后就可以在处理函数里取到对应的值: ...

  4. django基础入门之搭建博客系统

    Django基础 Django采用了MVC的软件设计模式,即模型M,视图V和控制器C. 安装django: pip install django=版本 新建一个目录文件进入cmd   启动一个项目 d ...

  5. 学一点django基础

    学一点Django基础 目录 文章目录 目录 一.Django框架的介绍 Django的安装 Django框架开发 创建项目的指令 Django项目的目录结构 URL 介绍 视图函数(view) Dj ...

  6. Django基础教程

    一.Django基础与设计模型 1.Django是什么? Django 是用 Python 开发的一个免费开源的 Web 框架,可以用于快速搭建高性能.优雅的网站,Django 提供了许多网站后台开发 ...

  7. 小酌Django1——Django基础

    小酌Django1--Django基础 Python可以做:数据统计.爬虫.机器学习.人工智能- 还有Web开发:本文主要内容即以Python为基础进行简单Web应用开发: 目标: 学习Django: ...

  8. 我的Blog搭建之旅1——Django基础

    我的Blog搭建之旅1--Django基础 文章目录 我的Blog搭建之旅1--Django基础 事先说明 这不是一个Django教程! === 2019.1.29 === 配置 < pytho ...

  9. Django基础必会

    Django基础必会 Django项目目录 mysite-mysite-__init__.py-urls.py(函数和函数的对应关系)-settings.py(Django项目的配置信息)-wsgi. ...

最新文章

  1. 11gR2 GI和DB安装目录权限属主被修改后的恢复方法
  2. eip协议通信_3月免费公开课伺服、通信等课程重磅发布,火热报名中
  3. [YTU]_2759( 字符串---统计元音)
  4. 当要将其他类型转成String类型时候 看String的方法
  5. python-15:装饰函数之一
  6. BOOST_PROTO_EXTENDS_MEMBERS宏相关的测试程序
  7. 嵌入式linux 实现mdev SD卡和U盘自动挂载和卸载的方法 mdev.conf
  8. 【渝粤教育】国家开放大学2018年春季 8625-21T老年心理健康 参考试题
  9. 进击的美少女!浙大学姐两年发14篇论文! 一作10篇,顶刊4篇!
  10. android汉字转url,Android将文本中的URL转换为超链接工具类(原文本有超链接标签也适用)...
  11. Lync Server 2010迁移至Lync Server 2013部署系列 Part10:配置存档、监控服务器
  12. NestedScrollView嵌套ListView可行性总结
  13. 第四章_思科ASDM网管系统搭建(java环境,jdk环境)
  14. 谢霆锋张柏芝被曝婚变 范范微博擦泪为好友祷告
  15. linux锁屏命令 TM,Linux基本命令的使用(上)
  16. 苹果原装转接头不能连html,变革之际 iPhone 7P原装lightning耳机及转接头拆解
  17. k3s证书过期的处理 以及 修改k3s证书有效期为10年(或自定义时间)
  18. CF 1680 E. Moving Chips dp 2000
  19. 微风:什么样的人适合学习UI设计?
  20. 社保查询或者转移的一些事

热门文章

  1. C语言整数的取值范围
  2. Oracle的order by关键字
  3. 如何解除服务器注册,《天龙八部手游》服务器注册上限怎么办 服务器注册方法...
  4. 102份深圳炒房材料曝光 网友举报千人炒房大会
  5. python实现k core算法_python实现密度聚类(模板代码+sklearn代码)
  6. python怎么去重_python列表如何去重
  7. php排序算法算法,PHP排序算法之基数排序(Radix Sort)实例详解
  8. Membership学习(二)membership入门[xgluxv]
  9. [JSP]自定义标签库taglib
  10. Atitit 设计模式的本质思考】