自学web方向已经很久了,一直没有弄清楚整个web开发的底层概念,秉着先知道如何做,再知道为什么这么做的原则,之前一直都是以实现某个功能为主去学习。现在为了弄清整个web开发的概念,看了廖大大的教程再结合之前自己接触的web开发方面,顿时有一种豁然开朗的感觉,现在决定跟着教程走一遍。先附上教程链接:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432170876125c96f6cc10717484baea0c6da9bee2be4000
首先一个web应用的本质就是先由浏览器发送一个http请求给服务器,服务器收到请求后生成一个HTML文档然后将文档加入body发回给浏览器,浏览器收到信息后显示body。一般解析请求,接受请求,发送请求这些行为都是由apache,IIS,Nginx来做的,我们要做的就是生成html,这样就是一个WSGI接口。
先搭建开发环境,根据教程使用的是python3+mysql,安装相应的包
pip install aiohttp #异步处理框架 pip install jinja2 #模板引擎 pip install aiomysql #异步mysql驱动
整个webapp的骨架,就是通过异步IO,处理http请求,整个webapp监听着端口的请求,每次服务器端接收到一个请求就建立一个子进程去响应这个请求,提取本地的html文件放入返回的http请求中的body中。而整个html文件的生成又涉及到MVC架构,V就是VIEW层,负责展示HTML,C是控制层,负责调度url,M是model层,负责处理数据。C通过URL调度model和view,生成一个html页面。现在先根据教程写一个web骨架:
#!/usr/bin/env python #-*- coding:utf-8 -*- import logging; logging.basicConfig(level=logging.INFO) import asyncio, os, json, time from datetime import datetime from aiohttp import web def index(request): return web.Response(body=b'<h1>Awesome</h1>') @asyncio.coroutine def init(loop): app = web.Application(loop=loop) app.router.add_route('GET','/',index) srv = yield from loop.create_server(app.make_handler(),'127.0.0.1',9000) logging.info('server started at http://127.0.0.1:9000...') return srv loop = asyncio.get_event_loop() loop.run_until_complete(init(loop)) loop.run_forever()
logging模块负责生成日志,index函数负责响应http请求并返回一个html。aiohttp
则是基于asyncio
实现的HTTP框架。通过装饰器@asyncio.coroutine将一个生成器扔给eventloop去执行,这个eventloop监听本机ip的9000端口不断接受请求进行处理。并通过add_route方法设定url为http://127.0.0.1:9000,将index返回的html显示在这个url上。这是我理解的整个web骨架的原理