[py]彻底细究web框架的wsgi+逻辑处理模块
wsgi逻辑结构初探
web框架 = wsgi+逻辑处理app
接收请求,返回对应的内容


python wsgiref实现了wsgi规范.
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return "<h1>maotai</h1>"
if __name__ == '__main__':
httpd = make_server('', 8080, RunServer)
print 'http://127.0.0.1:8080'
httpd.serve_forever()
访问http://127.0.0.1:8080

打断点,看下wsgi给environ传了什么参数: 里面包含url

实现不同的请求由不同的逻辑模块处理

from wsgiref.simple_server import make_server
def new():
return "new"
def bbs():
return "bbs"
urls = {
"/new": new,
"/bbs": bbs,
}
def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
# 获取url
url = environ["PATH_INFO"]
# 根据url路由
if url == "/new":
msg = new()
elif url == "/bbs":
msg = bbs()
else:
msg = "404"
return msg
if __name__ == '__main__':
httpd = make_server('', 8080, RunServer)
print("http://127.0.0.1:8080")
httpd.serve_forever()
优化urls写法
from wsgiref.simple_server import make_server
def new():
return "new"
def bbs():
return "bbs"
urls = {
"/new": new,
"/bbs": bbs
}
def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ["PATH_INFO"]
# 当url在urls里时,获取到url对应的view名
if url in urls.keys():
func_name = urls[url]
res = func_name()
else:
res = "404"
return res
if __name__ == '__main__':
httpd = make_server('', 8003, RunServer)
print("http://127.0.0.1:8003")
httpd.serve_forever()
将一整坨代码模块化-搞成mvc模式
拆分有2个原因:
- 项目大了,代码多了,拆分方便管理
- 拆分模块化简化复用

controller.py: 通过file操作,获取模板内容,返回
def new():
# return "index"
f=open("./index.html",'r')
tmpl = f.read()
f.close()
return tmpl
def bbs():
return "bbs"
urls.py
import controller
urls={
"/new":controller.new,
"/bbs":controller.bbs,
}
start.py
from wsgiref.simple_server import make_server
from urls import urls
def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ["PATH_INFO"]
if url in urls.keys():
msg = urls[url]()
else:
msg = "404"
return msg
if __name__ == '__main__':
httpd = make_server('', 8003, RunServer)
print "http://127.0.0.1:8003"
httpd.serve_forever()
template: 返回time到网页: 字符串replace


index.html
<body>
here is maotai's bbs
<h1>{{item}}</h1>
</body>
controller.py
思路: 使用字符串替换方法替换html中的指定字符
import os
import time
def bbs():
f = open(os.path.join("views", "bbs.html"), 'r')
html = f.read()
f.close()
html = html.replace("{{item}}", str(time.time()))
return html
template: 使用jinjia2渲染模板
controller.py: 使用jinjia2渲染(字符串替换思路一样,只不过在html里支持循环等语法.)
import os
from jinja2 import Template
def bbs():
f = open(os.path.join("views", "bbs.html"), 'r')
html = f.read()
f.close()
tmp=Template(html)
# 使用jinjia2渲染(字符串替换思路一样)
html=tmp.render(name="maotai",user_list=['maotai','alice','cristin'])
return html.encode("utf-8")

[py]彻底细究web框架的wsgi+逻辑处理模块的更多相关文章
- python web框架 django wsgi 理论
django wsgi python有个自带的wsgi模块 可以写自定义web框架 用wsgi在内部创建socket对象就可以了 自己只写处理函数就可以了django只是web框架 他也不负责写soc ...
- Python web框架开发 - WSGI协议
浏览器进行http请求的时候,不单单会请求静态资源,还可能需要请求动态页面. 那么什么是静态资源,什么是动态页面呢? 静态资源 : 例如html文件.图片文件.css.js文件等,都可以算是静态资源 ...
- python web 框架的基本逻辑练习题
# -*- coding:utf-8 -*- # date : 2017/12/22 from wsgiref.simple_server import make_server # 首先是导入wsgi ...
- web服务器、WSGI跟Flask(等框架)之间的关系
之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 HTT ...
- Linux(CentOS7)系统中部署Django web框架
1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行 ...
- Django框架01 / http协议、web框架本质
Django框架01 / http协议.web框架本质 目录 Django框架01 / http协议.web框架本质 1.http协议 1.1 http协议简介 1.2 什么是http协议 1.3 H ...
- Python Web 应用:WSGI基础
在Django,Flask,Bottle和其他一切Python web 框架底层的是Web Server Gateway Interface,简称WSGI.WSGI对Python来说就像 Servle ...
- python web框架 django 工程 创建 目录介绍
# 创建Django工程django-admin startproject [工程名称] 默认创建django 项目都会自带这些东西 django setting 配置文件 django可以配置缓存 ...
- WEB框架概述(译)
在学习WEB框架之前,我个人觉得需要搞清楚一件事:什么是WEB框架?在网上找了很多资料,觉得什么是WEB框架这篇文章讲的比较全面而清晰,本文作者Jeff Knupp. 全文如下: Web 应用框架,或 ...
随机推荐
- 【开源整理】.Net开源项目资源大全
汇总了.NET平台开源的工具类库,新的内容在不断更新中.内容借鉴了博客园.伯乐在线.GitHub等平台. (注:下面用 [$] 标注的表示收费工具,但部分收费工具针对开源软件的开发/部署/托管是免费的 ...
- 在本机搭建mycat 单机环境,使用mariadb 伪集群
首先搭建mairadb的集群 master 使用端口3306 slave 使用端口3406 master 相关配置 在my.ini 文件的[mysqld] 节点中添加或修改如下配置 #允许其他机器re ...
- 【CSS系列】网页头部进度条方式一
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- IPhoneX网页布局 全屏布局(转)
IPhoneX全面屏是十分科技化的,但是由于其圆角和摄像头刘海位置以及操控黑条的存在使得我们需要去对其样式做一些适配,没有X的同学可以开启 Xcode 9 的iPhone X 模拟器作为学习和调试. ...
- photobeamer
NOKIA出品的photobeamer https://www.photobeamer.com/你打开这个网站,会生成的二维码手机上打开photobeamer这个软件,选择要显示的相片,再扫描刚才网页 ...
- Git 创建两个“本地分支”协同工作
一 代码拉下来后,首先创建两个本地分之 $repo start master . //仅仅用于同步服务器的修改(此处master名字可以随意定,但是建议定成这样,好记忆) $repo start wo ...
- 应该了解的Openstack命令
整理一下Openstack的命令.下面的命令,我都是全部在机器验证过,主要是参考 redhat文档 查看rabbitmq 队列 rabbitmqctl list_queues 查看keystone的用 ...
- Unity3D笔记 英保通八 关节、 布料、粒子系统
一.关节1.1..链条关节 Hinge joint :他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力 1.2.. ...
- Docker logs 命令
[root@docker01 ~]# docker logs --help Usage: docker logs [OPTIONS] CONTAINER Fetch the logs of a con ...
- windows下java开发资料汇总
开发环境搭建: (1) java开发环境配置 (2) maven环境快速搭建 项目部署: (1) Eclipse中项目部署方法 (2) 使用Eclipse构建Maven ...