web 框架分为两种,第一种不用 WSGI 标准,如 Tornado 框架,需要自己写 socket;第二种则用到了 WSGI 封装好的 socket 标准,如 Django/bottle/flask/web.py 框架。
接下用 python 的 wsgiref 模块做个小实例,该程序是在 python2.7 环境运行的,在 python3.4 下出现莫名错误~~
- 1 #coding:utf-8
- 2 from wsgiref.simple_server import make_server
- 3
- 4 def f1():
- 5 return "index"
- 6
- 7 def f2():
- 8 return "news"
- 9
- 10 routers = {
- 11 "/index/": f1,
- 12 "/news/": f2,
- 13 }
- 14
- 15 # environ包含用户请求的所有信息,是wsgi封装好的
- 16 def RunServer(environ, start_response):
- 17 start_response('200 OK', [('Content-Type', 'text/html')])
- 18 url = environ["PATH_INFO"]
- 19 """
- 20 if url == "/index/":
- 21 return "index"
- 22 elif url == "/news/":
- 23 return "news"
- 24 else:
- 25 return "404"
- 26 """
- 27 if url in routers.keys():
- 28 func_name = routers[url]
- 29 return func_name()
- 30 else:
- 31 return "404"
- 32
- 33
- 34 if __name__ == '__main__':
- 35 # 创建socket server对象(参数可查看源码构造函数,如果找不到可往父类找直至找到)
- 36 httpd = make_server('', 8000, RunServer)
- 37 print("Serving HTTP on port 8000...")
- 38 # 相当while循环,等待用户请求到来
- 39 # 只要有请求进来,执行RunServer函数
- 40 httpd.serve_forever()
运行结果:
在上一步骤中,对于所有的 index、news 均返回给用户浏览器一个简单的字符串,在现实的 Web 请求中一般会返回一个复杂的符合 HTML 规则的字符串,所以我们一般将要返回给用户的 HTML 写在指定文件中,然后再返回。
虽然可以返回给用户 HTML 的内容以现实复杂的页面,但是还是存在问题:如何给用户返回动态内容?
首先你要先导入 jinja2 模块,注意是在 python2.x 环境下导入。
导入成功后,先来看看下面的例子,了解下 jinja2 的用法:
目录结构:
templates/t1.html
- 1 <!DOCTYPE html>
- 2 <html lang="en">
- 3 <head>
- 4 <meta charset="UTF-8">
- 5 <title>Title</title>
- 6 </head>
- 7 <body>
- 8 <h1>zcl</h1>
- 9 <div>
- 10 <a style="color: red;">blog</a>
- 11 <div style="font-size: large;">zcl ---- ((x))</div>
- 12 </div>
- 13 </body>
- 14 </html>
templates/t2.html:
注意 jinja2 替换的语法规则:有循环则用 {% ... %}, 替换字符则用 {{...}}.
- 1 <!DOCTYPE html>
- 2 <html lang="en">
- 3 <head>
- 4 <meta charset="UTF-8">
- 5 <title>Title</title>
- 6 </head>
- 7 <body>
- 8 <h1>{{name}}</h1>
- 9 <hr />
- 10 <ul>
- 11 {% for item in user_list %}
- 12 <li>{{item}}</li>
- 13 {% endfor %}
- 14 </ul>
- 15
- 16 </body>
- 17 </html>
web_1.py:
- 1 #coding:utf-8
- 2 from wsgiref.simple_server import make_server
- 3 import time
- 4 from jinja2 import Template
- 5
- 6
- 7 def f1():
- 8 f = open("templates/t1.html")
- 9 data = f.read()
- 10 f.close()
- 11 db_str = str(time.time())
- 12 data = data.replace("((x))", db_str) #将t1.html中的((x))值替换成db_str即当前时间
- 13 return data
- 14
- 15
- 16 def f2():
- 17 f = open('templates/t2.html')
- 18 result = f.read()
- 19 template = Template(result)
- 20 # 接收值,进行特殊的替换
- 21 data = template.render(name='John Doe', user_list=['alex', 'eric'])
- 22 return data.encode('utf-8') #必须加encode('utf-8')否则无法访问网页
- 23 routers = {
- 24 "/index/": f1,
- 25 "/news/": f2,
- 26 }
- 27
- 28 # environ包含用户请求的所有信息,是wsgi封装好的
- 29 def RunServer(environ, start_response):
- 30 start_response('200 OK', [('Content-Type', 'text/html')])
- 31 url = environ["PATH_INFO"]
- 32
- 33 if url in routers.keys():
- 34 func_name = routers[url]
- 35 return func_name()
- 36 else:
- 37 return "404"
- 38
- 39
- 40 if __name__ == '__main__':
- 41 # 创建socket server对象(参数可查看源码构造函数,如果找不到可往父类找直至找到)
- 42 httpd = make_server('', 8000, RunServer)
- 43 print("Serving HTTP on port 8000...")
- 44 # while循环,等待用户请求到来
- 45 # 只要有请求进来,执行RunServer函数
- 46 httpd.serve_forever()
访问 http://127.0.0.1:8000/news / 与 http://127.0.0.1:8000/index/
前阵子在网上找实习有看到要求熟悉 MVC。什么是 MVC 呢?
这个图我可是画了很久的!! 我们已经知道服务端返回 HTML 字符串给客户端 (浏览器),但并不是单单从 HTML 文档取数据再直接通过路由系统 -->WSGI 发送给客户端。比如我博客园的个人主页,当我点击时,会看到此时我只有 25 个粉丝,但 25 这个数据肯定不是在 HTML 文档的吧! 在哪里?当然是在数据库中啦。所以当你点击我的个人主页,其实此时不仅要从 HTML 文档取数据,还要从数据库中取数据,再通过 jinja2 的替换规则进行替换 (模板渲染)。你懂了么
好,还是说回 MVC 吧。其实 MVC 只是代码的目录结构,只是听起来很高大上而已~~
想必各位一定知道模块化吧 (找实习也有看到这个要求哈)。根据上图,我们可以把处理数据(库) 的功能模块放在一个目录下,存放 HTML 的模块放在一个目录下:
MTV 与 MVC 同理:
MVC 目录例子:
django 框架是基于 MTV 模式的,下面我创建一个 django 程序 (注意看目录结构):
来源: http://www.cnblogs.com/0zcl/p/6509411.html