zoukankan      html  css  js  c++  java
  • flask框架基本使用(1)(基本框架搭建与请求参数接收)

    #转载请留言联系

    Flask 是一个 Python 实现的 Web 开发微框架。

    1.搭建Flask开发环境

        在你开发项目的时候,你拥有的项目越多,同时使用不同版本的 Python 工作的可能性也就越大,或者起码需要不同版本的 Python 库。悲惨现实是:经常会有库破坏向后兼容性。所以我们需要在虚拟环境下进行 flask 开发。这时候就要用到 virtualenv ! virtualenv 可以为每个不同项目提供一份 Python 安装。它并没有真正安装多个 Python 副本,但是它确实提供了一种巧妙的方式来让各项目环境保持独立。

        在 virtualenv 中,开发环境是唯一的,只存在虚拟环境中,但是我们操作的文件都是系统中的,并不是独立的。注意和虚拟机区分开来。

    • 安装虚拟环境的命令 :

    sudo pip3 install virtualenv

    sudo pip3 install virtualenvwrapper #这是管理virtual的工具

    安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:

    • 创建目录用来存放虚拟环境

    mkdir ~/.virtualenvs

    • 打开~/.bashrc文件,并添加如下:

    export WORKON_HOME=~/.virtualenvs

    source /usr/local/bin/virtualenvwrapper.sh

    • 导入

    source ~/.bashrc

    • 创建虚拟环境

    python2:mkvirtualenv 虚拟环境名字

    python3:mkvirtualenv -p python3 虚拟环境名字

    • 查看虚拟环境

    workon +两次Tab键

    • 进入虚拟环境

    workon 虚拟环境名字

    • 退出虚拟环境

    deactivate

    • 删除虚拟环境

    rmvirtualenv 虚拟环境名字

    搭建完毕后可以在pycharm中选择 .virtualenv 文件夹里面的虚拟环境文件夹的python来作为解析器。

    注意:在虚拟环境中安装扩展包的时候,不要使用sudo,使用了sudo则表示给真实电脑中安装扩展包了。

    2.使用flask写一个最简单的web服务器

    from flask import Flask
    
    app=Flask(__name__)    #Flask函数接收一个参数__name__,它会指向程序所在的包
    
    @app.route("/")    #装饰器的作用是将路由映射到视图函数 index
    def index():
        return "hey,gril"
    
    if __name__ == '__main__':
        app.run()    #Flask应用程序实例的 run 方法启动 WEB 服务器

     

    3.flask初始化参数与加载配置

    • 初始化参数
    1 app=Flask(__name__,
    2           static_folder='static', 
    3           static_url_path='/hide',
    4           template_folder='templates')

    static_url_path主要用于改变url的path的,静态文件放在static下面,所以正常情况url是static/filename ,但是可以通过static_url_path来改变这个url。

    static_folder主要是用来改变url的目录的,默认是static,可以通过这个变量来改变静态文件目录。

    第2,3行的作用综合是这样:用户输入url时,xxx/hide/123.jpg。实际上在服务器上的路径是./static/123.jpg。

    template_folder是用来设置html模板文件的目录。

    • 加载配置

    加载配置常用的有两种方式:

    (1)在配置对象中加载(最常用)

    from flask import Flask
    
    app=Flask(__name__)
    
    class Setting(object):
        DEBUG=True
    
    app.config.from_object(Setting)
    
    @app.route("/")
    def index():
        return "123456"
    
    if __name__ == '__main__':
        app.run()

    (2)在配置文件中加载

    from flask import Flask
    
    app=Flask(__name__)
    
    app.config.from_pyfile("config.ini")    #新建一个文件,名为config.ini。内容就是设置
    
    @app.route("/chichung")
    def index():
        return "chichung"
    
    if __name__ == '__main__':
        app.run()

    拓展:

    debug只能在开发过程中开启,如果项目上线了,则必须关闭debug模式,否则容易遭到网络攻击。
    作用:
    1. 在开发过程中,可以帮助我们快速定位代码错误位置,方便调试2. 在开发过程中,在项目代码修改以后自动重启。

     

    4.给路由传参

    from flask import Flask
    
    app=Flask(__name__)
    
    @app.route("/<int:username>")
    def usr_info(username):
        return "你的用户名是%s"%username    #这里是易错点,返回值一定要是字符串类型
    
    if __name__ == '__main__':
        app.run(debug=True)

    当用户输入xxx/123的时候,网页显示:你的用户名是123。

     

    5.指定请求方式

    from flask import Flask,request
    app=Flask(__name__)
    
    @app.route("/",methods=["get"])    #指定只接受get请求方式的请求
    def index():
        return “你好呀”
    
    if __name__ == '__main__':
        app.run()

    只接受get请求方式的请求,如果是其他请求方式,会返回 405 Method Not Allowed 错误。

     

    6.查询请求的数据

    当用户用 get 或者 post 方式向服务器提交信息时,我们应该怎么获取呢?

    • request:flask中代表当前请求的request对象
    • 作用:在视图函数中取出本次请求数据
    • 导入from flask import request

    常用的属性如下:

    属性说明类型
    data 记录请求的数据,并转换为字符串 *
    form 记录请求中的表单数据 MultiDict
    args 记录请求中的查询参数 MultiDict
    cookies 记录请求中的cookie信息 Dict
    headers 记录请求中的报文头 EnvironHeaders
    method 记录请求使用的HTTP方法 GET/POST
    url 记录请求的URL地址 string
    files 记录请求上传的文件 *

    示例(1):获取get请求的数据

    from flask import Flask,request
    app=Flask(__name__)
    
    @app.route("/",methods=["get"])
    def index():
        return "你的用户名是"+request.args.get("username")
    
    if __name__ == '__main__':
        app.run()

    示例(2):获取post请求的数据

    from flask import Flask,request
    
    app=Flask(__name__)
    
    @app.route("/",methods=["post"])
    def index():
        print(request.form)
        print(request.form.get("name"))
        return "hello"
    
    if __name__ == '__main__':
        app.run()

    提示:要实验的可以用postman。

    7.正则匹配路由

    在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问。

    具体实现步骤为:

    • 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
    • 自定义转换器:自定义类继承于转换器基类
    • 添加转换器到默认的转换器字典中
    • 使用自定义转换器实现自定义匹配规则

    系统自带的转换器如下:

    DEFAULT_CONVERTERS = {
        'default':          UnicodeConverter,
        'string':           UnicodeConverter,
        'any':              AnyConverter,
        'path':             PathConverter,
        'int':              IntegerConverter,
        'float':            FloatConverter,
        'uuid':             UUIDConverter,
    }

    正则的转换器写法如下:(可作为模板直接调用)

    from werkzeug.routing import BaseConverter
    #
    自定义正则转换器 class RegexConverter(BaseConverter): def __init__(self, url_map, *args): super(RegexConverter, self).__init__(url_map) # 将接受的第1个参数当作匹配规则进行保存 self.regex = args[0] # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re app.url_map.converters['re'] = RegexConverter

     示例:

    from flask import Flask
    from werkzeug.routing import BaseConverter
    app=Flask(__name__)
    
    class RegexConverter(BaseConverter):
        def __init__(self, url_map, *args):
            super(RegexConverter, self).__init__(url_map)
            self.regex = args[0]
    app.url_map.converters['re'] = RegexConverter
    
    @app.route("/<re('d{3}'):id>")
    def index(id):
        return "你输入的网址格式为xxx.xxx.xxx.xxx/%s(三个数字),我说对了吧"%id
    
    if __name__ == '__main__':
        app.run() 
  • 相关阅读:
    全国疫情可视化地图(第三阶段)
    全国疫情可视化地图(第二阶段)
    JAVAWEB调用数据库显示图形化显示
    全国疫情可视化地图(第一阶段)
    第二周学习总结
    个人介绍及目前现状
    循环列表下练习循环子数组
    构建之法读书笔记(三)
    构建之法读书笔记(二)
    变叶木
  • 原文地址:https://www.cnblogs.com/chichung/p/9756935.html
Copyright © 2011-2022 走看看