python web 开发 - flask 框架使用(一)

开篇

本文主要内容是对 flask 框架官方文档的 (flask 如何使用)部分内容(项目中需要用到的知识点)进行简单总结。

准备工作

    python 基础 web 开发经验 安装 python 安装 flask => pip install flask 一个 IDE => 个人推荐 vscode 或者 pycharm

正文

1. 编写一个 helloworld

from flask import Flask
app = Flask(__name__)


@app.route(/)
def hello_world():
    return Hello, World!
    
if __name__ == __main__:
    app.run()
通过 IDE 运行,然后在浏览器上访问 localhost:5000
解释下上面的代码都做了什么
    导入 Flask 类 实例化 Flask 类 通过 route() 告诉 Flask 方法和 URL 的映射关系 将 Hello,World 字符串显示在浏览器

2. 路由

通过上面的 helloworld 程序已经了解到,Flask 框架是 通过 route() 将 URL 动态的跟函数绑定在一起,下面补充一个规则 - 将参数变量放在路径中。

# zhangsan 和 123 为参数,参数类型不受限制
# 正确示例
# 1. localhost:5000/user/zhangsan
# 2. localhost:5000/user/123
# 错误示例,报错: 404
# 1. localhost:5000/user
# 2. localhost:5000/user/ 

@app.route(/user/<username>)
def show_user(username):
	print(username)
    return User

# 跟上面不同的地方是,这里限制了参数类型为 int
# 正确示例
# 1. localhost:5000/post/123
# 错误示例
# 1. localhost:5000/post/aaa
@app.route(/post/<int:post_id>)
def show_post(post_id):
	print(post_id)
    return Post

# 不仅包含第一个示例的作用,还可以有如下用法:
# 访问: localhost:/path/subpath1/subpath2 
# 打印结果 : subpath1/subpath2
@app.route(/path/<path:subpath>)
def show_subpath(subpath):
    print(subpath)
    return Subpath

3. URL 末尾有无反斜杠的区别

对比下面两个路径 /test1/ 和 /test2, 前者比后者末尾多了一个反斜杠。

@app.route(/test1/)
def test1():
    return test1

@app.route(/test2)
def test2():
    return test2

正常情况下:

访问 localhost:5000/test1/ 和 localhost:5000/test2 即可请求到资源。

但是,

当我们访问 localhost:5000/test1 时, 会重定向到 localhost:5000/test1/

当我们访问 localhost:/5000/test2/ 时,就会出现 404 not found。

4. HTTP 方法

访问 URL 时, web 应用会使用不同的 http 方法,比如 get ,post 等。默认只支持 GET 方法。 例如,当我们用 post 方法访问上面任意一个 url 时,会出现下面的 405 状态码。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>

指定 method 方法

@app.route(/login, methods=[GET, POST])
def login():
    pass

5. request 对象

有了 request 对象,我们就可以获取请求对象里面的参数,比如 form 表单提交的参数,url 后面的key - value参数,请求方法类型(get 或 post)等等。

from flask import request

@app.route(/login, methods=[POST, GET])
def login():
    # 获取表单参数 
    username = request.form[username]
    password = request.form[password]
    # TODO 省略部分业务逻辑
    return login success

# 例如: localhost:5000/search?key=value
@app.route(/search, methods=[POST, GET])
def search():
    # 获取 url 参数
    searchword = request.args.get(key, )
    # TODO 省略部分业务逻辑
    return search success

6. 如何响应 json

    方式一 : 返回字典类型,会自动转换为 json
def user_api():
    return {
          
   
        "username": 章三,
        "age": 123,
    }
    方式二 : 依赖 jsonify
fron flask import jsonify

def user_api():
	data = [{
          
   username: zhaSan, password: "123456"},
            {
          
   username: wangWu, password: "123456"}]
    return jsonify(data)

总结

本文可能还有如下诸多内容未涉及,会在后面的博客中补充进去。

    上传文件 访问静态资源 cookie session 等等
经验分享 程序员 微信小程序 职场和发展