自學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骨架的原理