第二章 服务器程序和应用程序
-
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
-
服务器程序负责对socket服务端进行封装,并在请求到来时,对请求的各种数据进行整理。
-
应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。
-
WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
-
常用的WSGI服务器有uwsgi(线上)、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref(性能较差,用于测试),Django开发环境用的就是这个模块来做服务器。
-
negix:把静态页面返回,不经过Django,动态交给uwsgi用于Django处理,再返回
-
2.2 wsgiref
-
利用wsgiref模块替换socket server 部分
from wsgiref.simple_server import make_server def home(url): s = '这是页面{}'.format(url) print(s) return s.encode('utf-8') def index(url): s = '这是页面{}'.format(url) print(s) return bytes(s, encoding='utf-8') url_li = {'/index': index, '/home': home} def run(environ, start_response): # 设置http响应头 start_response('200 ok', [('Content-Type', 'text/html;charset=utf8'), ]) url = environ['PATH_INFO'] print(url, ) if url_li.get(url): response = url_li[url](url) else:response = b'404 not found' return [response, ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8000, run) print("我在8090等你哦...") httpd.serve_forever()
-
模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法规则写上,其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容。
#!/usr/bin/env python # -*- coding:utf-8 -*- from jinja2 import Template from wsgiref.simple_server import make_server def index(url): with open('./html/index2.html', 'r', encoding='utf-8') as f: data = f.read() # 生成模版文件 template = Template(data) # 把数据填充到模版 res = template.render({'name': 'henry', 'hobby': ['reading', 'movies', 'musics']}) return bytes(res, encoding='utf-8') def run_server(environ, start_response): start_response('200 ok', [('Content-Type', 'text/html;charset=utf8'), ]) url = environ['PATH_INFO'] reponse = index(url) return [response, ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8000, run_server) print('here') httpd.serve_forever()