python web快速入门

WSGI 接口

  • Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口
  • 无论多么复杂的Web应用程序,入口都是一个WSGI处理函数;HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body
  • 其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, web!</h1>']

WEB 框架

  • Web框架在WSGI接口之上进一步抽象,专注于用一个 函数 处理一个 URL
  • python web框架很多,这里的示例代码就使用 flask 作为展示,这里基本的原理就是通过python的装饰器实现了 url 到 处理函数的映射
from flask import Flask
from flask import request

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home():
    return '<h1>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():
    # 需要从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()

参考代码来自:https://www.liaoxuefeng.com/wiki/1016959663602400/1017806952856928


使用模板

  • 前面的示例中最令人头疼的一点是html代码写在一个字符串里面,代码一多简直令人痛不欲生
  • 使用模版最大的好处就是分离了python 和 html 代码,使得页面的编写更加容易同时更容易维护
  • 使用模板,我们需要预先准备一个HTML文档,这个HTML文档不是普通的HTML,而是嵌入了一些变量和指令,根据相应的数据渲染得到最终的html页面
  • 模版相比普通的html就是多了变量的获取和逻辑代码的嵌入,这对于 jinja2 模版来说分别用{{ name }}{% code %}来实现

一、模版改造

  • 准备:先安装好 flask 和 jinja2
pip install flask jinja
  • python代码
from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home():
    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():
    username = request.form['username']
    password = request.form['password']
    if username == 'admin' and password == 'password':
        return render_template('sign-ok.html', username=username)
    return render_template('form.html', message='Bad username or password', username=username)


if __name__ == '__main__':
    app.run()

  • 各种模版页面(flask默认使用的模版是jinja2)
<html>
<head>
    <title>Home</title>
</head>
<body>
<h1 style="font-style:italic">Home</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>sign-in page</title>
</head>
<body>
{% if message %}
<p style="color:red">{{ message }}</p>
{% endif %}
<form action="/signin" method="post">
    <legend>Please sign in:</legend>
    <p><input name="username" placeholder="Username" value="{{ username }}"></p>
    <p><input name="password" placeholder="Password" type="password"></p>
    <p>
        <button type="submit">Sign In</button>
    </p>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Welcome, {{ username }}</title>
</head>
<body>
<p>Welcome, {{ username }}!</p>
</body>
</html>

二、总结

  • 使用 flask 等 web 框架进行开发就更加符合 MVC 的范式
  • 其中我们的html模版是我们需要呈现给用户看到的视图(View),python中的 url 处理函数就是控制器(Controller),Model就是用来将数据传递给 View,python中的Model一般是被封装为一个 dict(将关键字参数进行封装)
  • 模板除了我们上面使用的 jinja2 ,常用的还有以下这几种
Mako:用<% ... %>和${xxx}的一个模板;
Cheetah:也是用<% ... %>和${xxx}的一个模板;
Django:Django是一站式框架,内置一个用{% ... %}{{ xxx }}的模板
发布了153 篇原创文章 · 获赞 51 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/stanwuc/article/details/104038721