Flask官方文档学习-flask快速入门

环境搭建

  1. 下载安装Python3:www.python.org
  2. 终端运行命令:python3 -m venv flask_dev,来创建虚拟环境
  3. 启用虚拟环境,终端使用命令 source /flask_dev/bin/activate; Windows 使用flask_dev/bin/activate.bat
  4. 安装Flask:激活虚拟环境后使用pip3 install flask
  5. 该实例在Pycharm编写并运行

快速建立一个应用

from flask import Flask
# __name__: 在当前模块中,__name__的值等于'__main__'
app = Flask(__name__)

# 路由:用户通过访问该应用所在的服务器IP地址加上route()装饰器括号里的地址访问到对应函数下的返回内容
@app.route('/')
def hello_world():
    return 'Hello Flask!'
    
# 启动这个应用
if __name__ == '__main__':
    # run()函数的参数,host设置成0.0.0.0可以使同一局域网的用户访问你,
    # debug设置成True为打开调试模式,服务器会在修改应用代码之后自动重启,生产环境不要打开这个哦!
    app.run(debug=True, host='0.0.0.0')

Gw7DII.png

路由-动态URL

通过把URL的一部分内容标记为<变量名>在url中添加变量,用户可直接传入变量值,也可以通过使用<变量类型:变量值>来指定用户传入值的类型规则

@app.route('/user/<username>')
# 函数参数需要使用与route装饰器中的变量路由名,上面装饰器表示接受的变量名为username
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username


@app.route('/xpath/<path:file_path>')
def show_file_path(file_path):
    return 'File Path is %s' % file_path

Gwqcz6.md.png

可指定的类型/转换器类型:

变量类型 接受的值类型
string (缺省值) 接受任何不包含斜杠的文本
int 接受正整数
float 接受正浮点数
path 类似 string ,但可以包含斜杠
uuid 接受 UUID 字符串

唯一URL/自动重定向

@app.route('/project/')  # 当访问这个路由时IP地址/project即可,它会自动重定向到/project/这个地址上去
def show_project():
    return 'project1, project2'


@app.route('/about')  # 当访问这个路由时,如果写成了/about/ 将得到一个404的错误信息
def show_about():
    return '关于我们!'

GwOWUH.png

URL构建

@app.route('/login')
def login():
    return 'login'


@app.route('/user_profile/<username>')
def profile(username):
    from flask import escape
    # escape的用法:https://zhuanlan.zhihu.com/p/33143358
    return '{}\'s profile'.format(escape(username))

# url_for()用于构建指定函数的url,第一个参数为函数名,可以有多个关键值参数,每个关键字参数对应URL中的变量,未知变量将添加到url中作为查询参数
with app.test_request_context():
    from flask import url_for
    print(url_for('login'))
    # 在login函数中没有id这个参数,将其添加到url中作为查询参数
    print(url_for('login', id='/234'))
    print(url_for('profile', username='root'))
    # 打印出来的地址可以加上IP直接访问,

GwzcAU.png

HTTP方法

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

from flask import request

# 如果当前使用了 GET 方法, Flask 会自动添加 HEAD 方法支持,
# 并且同时还会 按照 HTTP RFC 来处理 HEAD 请求。同样, OPTIONS 也会自动实现。
@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        return '注册结果!'
    else:
        return '注册页面!'

G0pPqx.png

请求对象

通过使用 method 属性可以操作当前请求方法,通过使用 form 属性处理表单数据(在 POST 或者 PUT 请求 中传输的数据)。以下是使用上述两个属性的例子:

@app.route('/login_user', methods=['POST', 'GET'])
def login_user():
    if request.method == 'POST':
        user_input_name = request.form['username']
        user_input_pass = request.form['password']
        print(user_input_name)
        print(user_input_pass)
        if user_input_name == 'admin' and user_input_pass == '123456':
            return '登录成功!'
        else:
            return '用户名或密码错误!'
# 当 form 属性中不存在这个键时会引发一个 KeyError

G0CoxH.png

文件上传

使用Flask处理文件上传,需要在HTML表单中设置enctype"multipart/form-data"属性;通过请求对象 files 属性来访问上传的文件;用于把上传文件保存到服务器的文件系统中的 save() 方法

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    # secure_filename 获取到文件在上传前的名称
    from werkzeug.utils import secure_filename
    if request.method == 'POST':
        f = request.files['upload_file']
        # 保存的路径地址
        f.save('./' + secure_filename(f.filename))
        msg = '上传成功!'
    else:
        msg = '上传失败!'
    return msg

G0ilcQ.png

重定向和错误

@app.route('/page')
def show_page():
    # redirect 重定向到/login路由
    from flask import redirect
    return redirect(url_for('login'))

G0AoDJ.png

@app.route('/404')
def error_page():
    #  abort() 可以 更早退出请求,并返回错误代码:
    from flask import abort
    abort(404)

G0AcEn.png

JSON格式的API

如果从视图返回一个dict,那么它会被转换成一个JSON响应

@app.route('/me')
def me_api():
    return {
        'type': 'json',
        'api': '/me',
        'msg': 200
    }


@app.route('/list')
def user_list():
    # 使用jsonfiy序列化
    from flask import jsonify
    """
      Example usage::

        from flask import jsonify

        @app.route('/_get_current_user')
        def get_current_user():
            return jsonify(username=g.user.username,
                           email=g.user.email,
                           id=g.user.id)

    This will send a JSON response like this to the browser::

        {
            "username": "admin",
            "email": "admin@localhost",
            "id": 42
        }

    """
    return jsonify('root', 'admin')

G0mpSP.png

会话

import os
from flask import session, escape, redirect

# os.urandom(16) 随机生成16个字节的串,一个字节是8位
# 使用secret_key 来设置密钥
app.secret_key = os.urandom(16)


@app.route('/index')
def index():
    if 'username' in session:
        return '你已经登录 %s ' % escape(session['username'])
    return '你需要登录!'


@app.route('/login_1', methods=['GET', 'POST'])
def login_1():
    if request.method == 'POST':
        iun = request.form['username']
        ipd = request.form['password']
        if iun == 'root' and ipd == '123456':
            session['username'] = iun
            print(session)
            return redirect(url_for('index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=password name=password>
            <p><input type=submit value=Login>
       <form method="post">
    '''


@app.route('/logout')
def logout():
    # 删除seesion字典中username这个键的值
    session.pop('username', None)
    return redirect(url_for('index'))

日志

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

文末

详细文件以上传到Github:https://github.com/Tceo1/flask_study/blob/master/flask_demo.py
本文代码出处基本全来自与Flask官方中文文档:https://dormousehole.readthedocs.io/en/latest/
其中‘静态文件’,‘渲染模版’,‘本地环境测试’,‘Cookies’,‘关于响应’,‘消息闪现’并未记录可移步官方文档查看

猜你喜欢

转载自www.cnblogs.com/thloveyl/p/12634257.html