本文讲述web后端框架及flask简单实现
web即万维网, 基于html和超文本的图形信息系统, web应用基本上就是指现在B/S架构上的应用
web开发: 即web应用开发, 编写代码服务端的代码, 对Browser的请求作出响应从而提供信息服务,目前比较流行MVC模式的框架
B/S架构: Browser/Server模式, 服务和数据库都运行在服务端, 由Browser提供客户查看的web页面 C/S架构: Client-Server模式, 服务运行在客户端, 数据库运行在服务器端,适用于比较重的应用, 比如Office, 端游
即Hybridtext Transport Protocol , 超文本传输协议. B/S架构中Browser和Server进行通信的协议,基于TCP/IP
Http请求四要素
Http响应要素:
即Hybridtext Mark Language: 超文本标记语言
要弄清楚如何进行web开发, 首先要先弄懂web服务器如何提供服务
我们发送一个Http请求给服务器, 服务器返回我们想要的数据,数据可以分为2种:
web服务器首先要完成这么几件事:
知道了需要做什么事,接下来就要考虑如何实现了
其实对于业务来说,真正有意义的响应状态码, 响应头和响应体 我们真正想要做的是,是第2步拿到请求数据, 准备数据,返回响应数据 而网络底层的交互, HTTP层面的请求接受解析, 响应发送格式, 对于我们麻烦而且没有实际意义的事, 为了避免这种麻烦,我们就需要WSGI了
即Web Server Gateway Interface, Web服务器通道接口 我们只需要:
运行过程:
HTTP处理函数
from loguru import logger
# 定义一个wsgi函数,后续交给wsgi服务器调用
def application(environ, start_response):
logger.warning(environ['QUERY_STRING']or 'No QUERY_STRING')
start_response('200 OK', [('Content_Type', "text/html")])
return [b'<h1>Hello, web!<h1>']
启动服务器
from wsgiref.simple_server import make_server
from hello import application
# 使用定义好的wsgi HTTP处理函数,创建一个wsgiref服务器对象
http_server = make_server("", 8000, application)
print("Serving Http on port 8000...")
# 运行服务器
http_server.serve_forever()
wsgire是Python内置的对WSGI的参考实现,只能用来开发和测试
通过wsgi服务器,我们成功拿到了请求四要素, 而且知道怎么返回响应信息, 但是,一个服务器可能有上百个接口,Restful API还可能要对应4个请求方法, 如何将这些接口的业务实现代码组合起来的, 这个时候我们就需要web框架了
web框架建立业务代码与 请求方法+请求路径 的映射, 而我们只要对根据请求实现对应的业务代码 以flask为例
我们只需要:
运行过程:
from flask import Flask, request
from loguru import logger
app = Flask(__name__)
@app.route('/', methods=['GET'])
def home():
return '<h1>Welcom to BetterUs<h1>'
@app.route('/signin', methods=["GET"])
def signin_form():
return """
<form action="/signin" method='post'>
<p><input name="username"></p>
<p><input name="password"></p>
<p><button type="submit">Sign In</button></p>
</form>
"""
@app.route("/signin", methods=['POST'])
def signin():
logger.warning(request.form)
if request.form['username'] == "admin" and request.form['password']=='a1234':
return "Hello, admin"
return "Username or Password is not correct"
# flask自带一个小型web服务器
if __name__ == '__main__':
app.run()
有了web框架,让我们得以忽略 过多的接口url带来的复杂度,专业编写业务代码 json数据我们可以通过查询数据库返回, 而html页面我们要怎么处理返回?
按照MVC设计模式. 我们可以设置html模板(View), 而对其中一些需要变更的内容进行参数化, 根据请求解析的数据或者固定设置的数据, 形成参数池(Model), 在处理函数(Controller)中处理业务逻辑, 在model中取特定数据交给View生成html页面,返回给前段
以flask为例
我们需要:
一定要把模板放到正确的
templates
目录下,templates
和app.py
在同级目录下
运行过程:
app.py
from flask import Flask, request, render_template
from loguru import logger
app = Flask(__name__)
@app.route('/', methods=['GET'])
def home():
# return '<h1>Welcom to BetterUs<h1>'
return render_template("home.html")
@app.route('/signin', methods=["GET"])
def signin_form():
return render_template("form.html")
@app.route("/signin", methods=['POST'])
def signin():
logger.warning(request.form)
username, password = request.form['username'],request.form['password']
if username == "admin" and password == 'a1234':
return render_template("signin-ok.html", username=username)
return render_template("form.html", message="Bad username or password, username=username")
signin-ok.html
<html>
<head>
<title>Welcome, {{ username }}</title>
</head>
<body>
<p>Welcome, {{ username }}!</p>
</body>
</html>
graph LR
browser--请求进入-->Nginx--转发-->WSGI服务器--解析请求-->Flask框架+MVC结构--查询数据-->数据库