flask-快速上手

    科技2022-07-11  99

    一个最小的应用

    最小的flask-web应用是这样的:

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!'

    web应用的本质

    web应用的本质是这样的:

    浏览器发送一个HTTP请求;服务器收到请求,生成一个HTML文档;服务器把HTML文档作为HTTP响应的Body发送给浏览器;浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

    so, 最简单的web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。

    如果要动态生成html咋整?就需要把上述步骤自己来实现。正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。 这个接口就是WSGI:Web Server Gateway Interface。

    OK,接着向下说,第一行我们导入了Flask类,这个类的实例就是我们的wsgi应用。 我们在创建实例的时候把__name__当做一个参数传进去了。有了这个参数,Flask 才能知道在哪里可以找到模板和静态文件等东西。 然后我们使用 route() 装饰器指定URL。对应的URL会触发对应的处理函数。 函数返回需要在用户浏览器中显示的信息。

    路由

    使用 route() 装饰器可以把函数绑定到 URL。 最基本的使用例子如下:

    @app.route('/') def index(): return 'Index Page' @app.route('/hello') def hello(): return 'Hello, World'

    emm, 这样的路由写起来岂不是要累死?动态路由的话岂不是要写成个傻子? 没错。flask支持动态路由。

    变量规则

    通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 <converter:variable_name> ,可以选择性的加上一个转换器,为变量指定规则。 啥意思呢?就是说写在尖括号里面的,可以当做关键字参数传递给URL绑定的函数。而converter,也就是转换器,可以指定这个关键字参数的类型。

    @app.route('/user/<username>') def show_user_profile(username): # username , 关键字参数 return 'User %s' % escape(username) @app.route('/post/<int:post_id>') def show_post(post_id): # 指定了 post_id 是 int 类型 return 'Post %d' % post_id @app.route('/path/<path:subpath>') def show_subpath(subpath): # 指定了 subpath 是 path 类型, 即可以是一个路径字符串 return 'Subpath %s' % escape(subpath)

    转换器的类型如下:

    唯一的 URL / 重定向行为

    以下两条规则的不同之处在于是否使用尾部的斜杠。

    @app.route('/projects/') def projects(): return 'The project page' @app.route('/about') def about(): return 'The about page'

    对于projects, 如果url输成了projects 而不是 projects/ , 会自动重定向到projects/ . 对于about, 如果url输成了about , 则就是走到about. 输入about/ , 则会404.

    URL 构建

    每太搞明白这是啥意思,日后再补充。

    HTTP 方法

    缺省情况下,一个路由只回应 GET 请求。 可以使用 route() 装饰器的 methods 参数来处理不同的 HTTP 方法:

    from flask import request @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': return do_the_login() else: return show_the_login_form()

    静态文件

    没看懂啥意思,后补。

    渲染模板

    在 Python 内部生成 HTML 不好玩,且相当笨拙。因为你必须自己负责 HTML 转义, 以确保应用的安全。因此, Flask 自动为你配置 Jinja2 模板引擎。

    使用 render_template() 方法可以渲染模板,你只要提供模板名称和需要 作为参数传递给模板的变量就行了。下面是一个简单的模板渲染例子:

    from flask import Flask, render_template # from flask.ext import restful import flask_restful as restful app = Flask(__name__) @app.route('/') def hello_world(): return render_template('index.html', name='test')

    index.html 存放在templates 下。 内容如下:

    <html> <head> </head> <body> {% if name %} <h1>Hello {{ name }}!</h1> {% else %} <h1>Hello, World!</h1> {% endif %} </body> </html>

    html里是jinja2的语法,不必去学,现在都是前后端分离开发的。

    操作请求数据

    对于 web 应用来说对客户端向服务器发送的数据作出响应很重要。在 Flask 中由全局 对象 request 来提供请求信息。这是线程安全的。

    日志

    日后再说。

    Processed: 0.029, SQL: 8