Flask修炼——视图及路由!



内容概述:
Web 访问流程
路由定义
json 数据格式
正则路由转换


Web 访问流程

客户端发送请求到服务器

服务器进行判断,请求静态资源的话就直接返回

请求其他功能服务器会把请求发送给 web 框架

由 web 框架来进行具体的业务逻辑判断,根据请求从数据库中查找数据

先返回给服务器,然后又服务器返回给客户端




搭建虚拟环境

windows 中安装虚拟环境

pip install virtualenv

pip install virtualenvwrapper-win # 支持 windows

配置环境变量:在环境变量中,加上 WORKON_HOME: 路径 这个环境变量

mkvirtualenv 虚拟环境名称 # 创建虚拟环境, 可以使用 -p 来指定 python 版本

workon # 列出所有的虚拟环境

workon 虚拟环境名称 # 切换虚拟环境

pip install flask # 在虚拟环境中安装 flask

pip list # 查看虚拟环境中安装的 flask

deactivate # 退出虚拟环境
rmvirtualenv 虚拟环境名称 # 删除虚拟环境

# 导入 Flask
from flask import Flask


# 创建 Flask 的应用程序
app = Flask(__name__,
            # static_path='/static',  # 表示静态文件访问的路径
            static_url_path='/python04',
            static_folder='static',  # 表示静态文件所存放的目录,默认值是 static
            template_folder='template'  # 表示模板文件存放的目录
            )


# ===从对象中加载配置=== (掌握)
# class Config(object):
#     DEBUG = True
# app.config.from_object(Config)

# ===从文件中加载配置==  (会用)
# app.config.from_pyfile('config.ini')

# ===从环境变量中加载配置=== (了解)
# app.config.from_envvar('ENVCONFIG')

# 一些常用的配置,可以直接通过 app. 的形式设置
app.debug = True
app.config['DEBUG'] = True


# 使用装饰器路由去与视图进行关联
@app.route('/')
def index():
    print(app.config['DEBUG'])
    return 'hello worldaaa'


if __name__ == '__main__':
    # 运行当前 Flask 应用程序
    app.run(debug=True)



路由定义(重点)

@app.route(“/”)

注意所有的路径都是以斜杠 / 开头

json数据格式(重点)

json.dumps() 把字典转换为 json

json.loads() 把 json 字符串转化为字典

jsonify() 将其他数据转化为 json

重定向

redirect : 从 flask 中导入这个模块 , 重定向到其他网站

url_for: 取到指定视图函数所对应的路由 url, 并且可以携带参数

返回自定义状态码

直接在返回的数据后面加上自定义的状态码即可

from flask import Flask, jsonify
from flask import json
from flask import redirect
from flask import request
from flask import url_for

app = Flask(__name__)


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


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


@app.route('/user/<int:user_id>')
def demo2(user_id):
    return 'demo2 %s' % user_id


@app.route('/demo3', methods=['GET', 'POST'])
def demo3():
    return 'demo3 %s' % request.method


@app.route('/json')
def demo4():
    json_dict = {
        "name": "laowang",
        "age": 18
    }
    # 使用 json.dumps 将字典转换成 json 字符串
    result = json.dumps(json_dict)

    # 使用 json.loads 将 json 转成字典
    # test_dict = json.loads('{"age": 18, "name": "laowang"}')

    #  jsonify 将其他数据转化为 json
    return jsonify(json_dict)


@app.route('/redirect')
def demo5():

    # 重定向到自己写的视图函数
    # url_for:取到指定视图函数所对应的路由url,并且可以携带参数
    return redirect(url_for('demo2', user_id=123))

    # 重定向到煎蛋
    # return redirect('http://www.jandan.com/ooxx')


@app.route('/demo6')
def demo6():
    return 'demo6', 666


if __name__ == '__main__':
    print(app.url_map)
    app.run(host='0.0.0.0', port=8888, debug=True)



正则路由转换

pycharm 导包快捷键: alt + enter

from flask import Flask
from flask import redirect
from flask import url_for
from werkzeug.routing import BaseConverter


class RegexConverter(BaseConverter):
    """自定义正则的转换器"""

    # regex = "[0-9]{6}"

    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        # 取到第一个值,给regex 属性赋值
        self.regex = args[0]

    def to_python(self, value):
        return int(value)


class ListConverter(BaseConverter):
    """自己定义转换器"""
    regex = "(\\d+.?)+\\d$"

    def to_python(self, value):
        """当匹配到参数之后,对参数做进一步的处理,再返回 给视图函数中"""
        return value.split(',')

    def to_url(self, value):
        """ 使用 url_for 的时候,对视图函数传的参数进行处理,处理完毕之后以便能够进行路由匹配"""
        result = ','.join(str(v) for v in value)
        return result


app = Flask(__name__)
# 将自己的转换器添加到默认的转换器列表中
app.url_map.converters["re"] = RegexConverter
app.url_map.converters["list"] = ListConverter


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


# 规则:/user/6 位数字,
# 自定义转换器
@app.route('/user/<re("[0-9]{6}"):user_id>')
def demo1(user_id):
    return "用户的id是 %s" % user_id


@app.route('/users/<list:user_ids>')
def demo2(user_ids):
    return "用户的列表是 %s" % user_ids


@app.route('/demo3')
def demo3():
    return redirect(url_for('demo2', user_ids=[1, 2, 3, 4, 5]))


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8888, debug=True)

猜你喜欢

转载自blog.csdn.net/qyf__123/article/details/82973647
今日推荐