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渲染模板

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+逻辑处理模块的更多相关文章

  1. python web框架 django wsgi 理论

    django wsgi python有个自带的wsgi模块 可以写自定义web框架 用wsgi在内部创建socket对象就可以了 自己只写处理函数就可以了django只是web框架 他也不负责写soc ...

  2. Python web框架开发 - WSGI协议

    浏览器进行http请求的时候,不单单会请求静态资源,还可能需要请求动态页面. 那么什么是静态资源,什么是动态页面呢? 静态资源 : 例如html文件.图片文件.css.js文件等,都可以算是静态资源 ...

  3. python web 框架的基本逻辑练习题

    # -*- coding:utf-8 -*- # date : 2017/12/22 from wsgiref.simple_server import make_server # 首先是导入wsgi ...

  4. web服务器、WSGI跟Flask(等框架)之间的关系

    之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 HTT ...

  5. Linux(CentOS7)系统中部署Django web框架

    1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行 ...

  6. Django框架01 / http协议、web框架本质

    Django框架01 / http协议.web框架本质 目录 Django框架01 / http协议.web框架本质 1.http协议 1.1 http协议简介 1.2 什么是http协议 1.3 H ...

  7. Python Web 应用:WSGI基础

    在Django,Flask,Bottle和其他一切Python web 框架底层的是Web Server Gateway Interface,简称WSGI.WSGI对Python来说就像 Servle ...

  8. python web框架 django 工程 创建 目录介绍

    # 创建Django工程django-admin startproject [工程名称] 默认创建django 项目都会自带这些东西 django setting 配置文件 django可以配置缓存 ...

  9. WEB框架概述(译)

    在学习WEB框架之前,我个人觉得需要搞清楚一件事:什么是WEB框架?在网上找了很多资料,觉得什么是WEB框架这篇文章讲的比较全面而清晰,本文作者Jeff Knupp. 全文如下: Web 应用框架,或 ...

随机推荐

  1. django rest framwork教程之外键关系和超链接

    此时,我们的API中的关系通过使用主键来表示.在本教程的这一部分中,我们将通过使用超链接来改善关系的内聚性和可发现性 为我们的API的根创建一个端点 现在我们有"snippets" ...

  2. 修改JS文件不能及时在页面中体现,需重启浏览器?

    对JS文件做个小小的改动,哪怕是加一句简单的ALERT语句,都要重启浏览器才能看到.你有这样的烦恼吗?怎样不用重启浏览器就能及时体现JS的变化呢? 对浏览器(IE)做如下设置即可:1.点击 工具栏 - ...

  3. jQuery队列(一)

    jQuery的队列依赖缓存机制事件,它同时是animate的基础. 它不像事件机制.缓存机制.回调机制一样有自己的命名空间,由于比较简单,所以直接挂在到$和jQuery对象上. 它提供的基础方法有: ...

  4. Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析

    1. 普通match如何转换为term+should { "match": { "title": "java elasticsearch"} ...

  5. 查看docker容器的IP地址

    |awk '{print $2}' |tr '"' " " |tr ',' ' '       # 可以用容器id或名称 方法二: docker inspect --fo ...

  6. 【转】失效迭代器(Invalidating Iterators)

      当一个容器变化时,指向该容器中元素的迭代器可能失效.这使得在迭代器变化期间改变容器容易出现问题.在这方面,不同的容器提供不同的保障:vectors: 引起内存重新分配的插入运算使所有迭代器失效,插 ...

  7. golang学习资料[Basic]

    http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html 基础语法 <Go By Exa ...

  8. Unity3D笔记 英保通五 鼠标事件与GUI系统双击检测

    一.如何使用GUI事件来检测鼠标是否按下的事件: 获取当前事件:var e:Event=Event.current: using UnityEngine; using System.Collectio ...

  9. vue--自定义指令进行验证(1)

    实例代码: <template> <div id="app" class="app"> <h3>{{msg}}</h3 ...

  10. Linux查看磁盘目录内存空间使用情况

    du 显示每个文件和目录的磁盘使用空间 命令参数 -c或--total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和. -s或--summarize  仅显示总计,只列出最后加总的 ...