一、仅使用WSGI接口的限制
本质上,写一个Web App就是写一个WSGI处理函数(根据请求的内容,生成相应的HTML代码),然后利用符合WSGI规范的服务器调用处理函数,完成对每个请求的响应。(隐藏了HTTP原始请求和响应、HTTP请求的解析)
如何请求的问题结局后,怎么处理不同的URL、相同URL的不同请求类型(POST
、GET
、HEAD
、DELETE
等)仍待解决。
简单的想法是:挨个判断传入的HTTP请求的URL及请求类型
def application(environ, start_response):
method = environ["REQUEST_METHOD"]
path = environ["PATH_INFO"]
#根据请求的类型及路径,分别执行不同的处理函数
if method=="GET" and path=="/":
return handle_home(environ, start_response)
if method=="POST" and path=="/signin":
return handle_signin(environ, start_response)
...
但是这样有个明显的缺点,当逻辑复杂后,代码很难维护。需要在WSGI接口的基础上,再抽象出一个函数专注于处理URL,而URL到与之对应处理函数之间的映射由Web框架来实现。
二、使用Flask开发一个简单的Web App
功能:处理三个URL
-
GET /
:首页,返回HOME; -
GET /signin
:登录页,显示登录页表单; -
POST /signin
:处理登录表单,显示登录结果。 - 同一个URL
/signin
分别有两种请求,映射到两个处理函数。GET
请求的处理函数是返回表单的HTML源码,显示在浏览器中;POST
请求的处理函数是验证登录信息,返回相应的结果。
from flask import Flask
from flask import request
app = Flask(__name__)
#======================================================================
#主页
@app.route('/', methods=["GET", "POST"])
def home():
return "<h1>Hello, in my home!</h1>"
#======================================================================
#表单页
@app.route("/signin", methods=["GET"])
def signin_form():
return '''<form action="/signin" method="POST">
<p><input name="username"></p>
<p><input name="password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>
'''
#======================================================================
#登录页
@app.route("/signin", methods=["POST"])
def signin():
#get information from object request
if request.form['username'] == "admin" and request.form['password'] == "password":
return "<h3>Hello admin!</h3>"
return "<h3>Bad username or password</h3>"
#======================================================================
#启动服务
if __name__ == "__main__":
app.run()