web框架python

22.python笔记之web框架

一、web框架本质

1.基于socket,自己处理请求

#!/usr/bin/env python3
#coding:utf8
import socket
def handle_request(client):
    #接收请求
    buf = client.recv(1024)
    print(buf)
    #返回信息
    client.send(bytes(‘<h1>welcome liuyao webserver</h1>‘,‘utf8‘))
def main():
    #创建sock对象
    sock = socket.socket()
    #监听80端口
    sock.bind((‘localhost‘,8000))
    #最大连接数
    sock.listen(5)
    print(‘welcome nginx‘)
    #循环
    while True:
        #等待用户的连接,默认accept阻塞当有请求的时候往下执行
        connection,address = sock.accept()
        #把连接交给handle_request函数
        handle_request(connection)
        #关闭连接
        connection.close()
if __name__ == ‘__main__‘:
    main()

2.基于wsgi

WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。

WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。

WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的。

很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 。

python标准库提供的独立WSGI服务器称为wsgiref。

#!/usr/bin/env python
#coding:utf-8
#导入wsgi模块
from wsgiref.simple_server import make_server

def RunServer(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    return [bytes("welcome webserver".encode(‘utf8‘))]

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, RunServer)
    print ("Serving HTTP on port 8000...")
    httpd.serve_forever()
    #接收请求
    #预处理请求(封装了很多http请求的东西)

请求过来后就执行RunServer这个函数。

原理图:

当用户发送请求,socket将请求交给函数处理,之后再返回给用户。

二、自定义web框架

python标准库提供的wsgiref模块开发一个自己的Web框架

之前的使用wsgiref只能访问一个url
下面这个可以根据你访问的不同url请求进行处理并且返回给用户

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
    #根据url的不同,返回不同的字符串
    #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer,
    #wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response]
    request_url = environ[‘PATH_INFO‘]
    print (request_url)
    #2 根据URL做不同的相应
    #print environ #这里可以通过断点来查看它都封装了什么数据
    if request_url == ‘/login‘:
        return [bytes("welcome login",‘utf8‘)]
    elif request_url == ‘/reg‘:
        return [bytes("welcome reg",‘utf8‘)]
    else:
        return [bytes(‘<h1>404! no found</h1>‘,‘utf8‘)]

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, RunServer)
    print ("Serving HTTP on port 8000...")
    httpd.serve_forever()

当然 以上虽然根据不同url来进行处理,但是如果大量url的话,那么代码写起来就很繁琐。
所以使用下面方法进行处理

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server
def index():
    return [bytes(‘<h1>index</h1>‘,‘utf8‘)]
def login():
    return [bytes(‘<h1>login</h1>‘,‘utf8‘)]
def reg():
    return [bytes(‘<h1>reg</h1>‘,‘utf8‘)]
def layout():
    return [bytes(‘<h1>layout</h1>‘,‘utf8‘)]
#定义一个列表 把url和上面的函数做一个对应
urllist = [
    (‘/index‘,index),
    (‘/login‘,login),
    (‘/reg‘,reg),
    (‘/layout‘,layout),
]
def RunServer(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
    #根据url的不同,返回不同的字符串
    #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer,wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response]
    request_url = environ[‘PATH_INFO‘]
    print (request_url)
    #2 根据URL做不同的相应
    #print environ #这里可以通过断点来查看它都封装了什么数据
    #循环这个列表 找到你打开的url 返回url对应的函数
    for url in urllist:
        if request_url == url[0]:
            return url[1]()
    else:
        #url_list列表里都没有返回404
        return [bytes(‘<h1>404 not found</h1>‘,‘utf8‘)]
if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, RunServer)
    print ("Serving HTTP on port 8000...")
    httpd.serve_forever()

三、模板引擎

对应上面的操作 都是根据用户访问的url返回给用户一个字符串的 比如return xxx

案例:

首先写一个index.html页面

内容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h1>welcome index</h1>
</body>
</html>

login.html页面

内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <h1>welcome login</h1>
    <form>
        user:<input type="text"/>
        pass:<input type="password"/>
        <button type="button">login in</button>
    </form>
</body>
</html>

python代码:

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server
def index():
    #把index页面读进来返回给用户
    indexfile = open(‘index.html‘,‘r+‘).read()
    return [bytes(indexfile,‘utf8‘)]
def login():
    loginfile = open(‘login.html‘,‘r+‘).read()
    return [bytes(loginfile,‘utf8‘)]
urllist = [
    (‘/login‘,login),
    (‘/index‘,index),
]
def RunServer(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
    #根据url的不同,返回不同的字符串
    #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer,wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response]
    request_url = environ[‘PATH_INFO‘]
    print (request_url)
    #2 根据URL做不同的相应
    #print environ #这里可以通过断点来查看它都封装了什么数据
    for url in urllist:
        #如果用户请求的url和咱们定义的rul匹配
        if request_url == url[0]:
            #执行
            return url[1]()
    else:
        #url_list列表里都没有返回404
        return [bytes(‘<h1>404 not found</h1>‘,‘utf8‘)]
if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, RunServer)
    print ("Serving HTTP on port 8000...")
    httpd.serve_forever()

但是以上内容只能返回给静态内容,不能返回动态内容
那么如何返回动态内容呢

自定义一套特殊的语法,进行替换

使用开源工具jinja2,遵循其指定语法

index.html 遵循jinja语法进行替换、循环、判断

先展示大概效果,具体jinja2会在下章django笔记来进行详细说明

index.html页面

内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--general replace-->
    <h1>{{ name }}</h1>
    <h1>{{ age }}</h1>
    <h1>{{ time }}</h1>

    <!--for circular replace-->
    <ul>
        {% for item in user_list %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
    <!--if else judge-->
    {% if num == 1 %}
        <h1>num == 1</h1>
    {% else %}
        <h1>num == 2</h1>
    {% endif %}
</body>
</html>

python代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time
#导入wsgi模块
from wsgiref.simple_server import make_server
#导入jinja模块
from jinja2 import Template
def index():
    #打开index.html
    data = open(‘index.html‘).read()
    #使用jinja2渲染
    template = Template(data)
    result = template.render(
        name = ‘yaoyao‘,
        age = ‘18‘,
        time = str(time.time()),
        user_list = [‘linux‘,‘python‘,‘bootstarp‘],
        num = 1
    )
    #同样是替换为什么用jinja,因为他不仅仅是文本的他还支持if判断 & for循环 操作
    #这里需要注意因为默认是的unicode的编码所以设置为utf-8
    return [bytes(result,‘utf8‘)]
urllist = [
    (‘/index‘,index),
]
def RunServer(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    #根据url的不同,返回不同的字符串
    #1 获取URL[URL从哪里获取?当请求过来之后执行RunServer,
    # wsgi给咱们封装了这些请求,这些请求都封装到了,environ & start_response]
    request_url = environ[‘PATH_INFO‘]
    print(request_url)
    #2 根据URL做不同的相应
    #循环这个列表
    for url in urllist:
        #如果用户请求的url和咱们定义的rul匹配
        if request_url == url[0]:
            print (url)
            return url[1]()
    else:
        #urllist列表里都没有返回404
        return [bytes(‘<h1>404 not found</h1>‘,‘utf8‘)]
if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, RunServer)
    print ("Serving HTTP on port 8000...")
    httpd.serve_forever()

四、MVC和MTV

1.MVC

全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

将路由规则放入urls.py

操作urls的放入controller里的func函数

将数据库操作党风model里的db.py里

将html页面等放入views里

原理图:

2.MTV

Models 处理DB操作

Templates html模板

Views 处理函数请求

原理图:

分类: python学习之旅

时间: 2024-10-05 16:13:54

web框架python的相关文章

简单的web框架(python)

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

python学习笔记-Day17 - web框架

web服务器和web客户端之间的网络通信,本质上是 socket的通信, 服务器端运行的是socketServer 客户端运行的是socketClient. 对于python web程序来说,一般来说会分为两部分,服务器程序\应用程序,  (jsp好像也是这样的,让我想起了java的war包,不是太了解,只知道这些war包可以组成jsp上的应用). 服务器程序:负责对socket服务器进行封装,在请求到来的时候,对请求进行整理, 应用程序   : 负责具体的业务逻辑处理, 为了方便应用程序的开发

python web框架学习笔记

一.web框架本质 1.基于socket,自己处理请求 #!/usr/bin/env python3 #coding:utf8 import socket def handle_request(client): #接收请求 buf = client.recv(1024) print(buf) #返回信息 client.send(bytes('<h1>welcome liuyao webserver</h1>','utf8')) def main(): #创建sock对象 sock

极简主义(Minimalist)Web 框架大汇总

极简主义(Minimalist)Web 框架大汇总 罗列了一系列极简主义的框架(简单.轻量级),按编程语言分好类,按字母顺序排序. 列表 CSS 框架 C 写的 Web 框架 PHP 写的 数据库 框架 前端 JS 的框架 Go 写的 Web 框架 Haskell 写的 Web 框架 Java 写的 Web 框架 JavaScript 写的 Web 框架 Lua 写的 Web 框架 Node.js 写的 Web 框架 Perl 写的 Web 框架 PHP 写的 Web 框架 Python 写的

python/web框架

web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8    import socket    def handle_request(client):     buf = client.recv(1024)     clien

Python之Web框架介绍

所有的语言Web框架本质其实就是起一个socket服务端,监听一个端口,然后运行起来 Web框架包含两部分,一部分是socket,另外一部分是业务的逻辑处理,根据请求的不同做不同的处理 Python的Web框架分成了两类, 即包含socket也包含业务逻辑处理的(tornado) 不包含socket(框架本身通过第三方模块实现socket)只包含业务逻辑处理(django,Flask) WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口.具

【Python之路】第十五篇--Web框架

Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf-8 import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, Seven")

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

Python之路【第十五篇】:Web框架

Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8   import socket   def handle_request(client):     buf = client.recv(10