zoukankan      html  css  js  c++  java
  • flask基础之安装和使用入门(一)

    前言

    Flask框架作为一个python极简化的web框架,它不像Django那样的重型,非常适合快速开发一些小型的应用。本人用flask开发了几个项目之后,慢慢研究flask底层的一些原理,开始一步步总结flask框架的使用方法以及设计原理。共勉!

    Flask框架简介

    • 基于Werkzeug工具箱编写的轻量级Web开发框架,主要面向需求简单的小应用;

    • 本身相当于一个内核,其他几乎所有的功能都需要用第三方的扩展来实现;

    • 核心是Werkzeug和Jinja2(路由模块和模板引擎);

    安装环境

    • 安装Flask和所有可能相关依赖的包:

    将所有相关的包放置在一个txt文件,如:requires.txt,内容如下:

    alembic==0.9.4
    amqp==2.2.2
    billiard==3.5.0.3
    celery==4.1.0
    certifi==2017.7.27.1
    chardet==3.0.4
    Flask==0.10.1
    Flask-Migrate==2.1.0
    Flask-Script==2.0.5
    Flask-Session==0.3.1
    Flask-SQLAlchemy==2.2
    Flask-WTF==0.14.2
    Jinja2==2.9.6
    kombu==4.1.0
    Mako==1.0.7
    
    • 创建一个python新的虚拟环境,执行安装:

    可参考:http://www.cnblogs.com/cwp-bg/p/7701231.html

    pip install -r requires.txt  
    

    创建一个简单的应用程序

    from flask import Flask
    app = Flask(__name__)
    
    # 装饰器的作用是将路由映射到视图函数index
    @app.route('/')
    def index():
        return 'ok'
    
    if __name__ == '__main__':
        app.run()
    

    执行启动后我们在浏览器输入:http://127.0.0.1:5000就可以访问我们刚刚建立的网站了,就这么方便!

    • app初始化简介
    # Flask实例的源码:
    class Flask(_PackageBoundObject):
        def __init__(self, import_name,  # 指定应用的名字和工程目录,默认为__name__
                    static_path=None,  #  是静态文件存放的路径,会赋值给static_url_path参数
                    static_url_path=None,  # 设置静态文件路由的前缀,默认为“/static”
                    static_folder='static', # 静态文件的存放目录, 默认值为"static"
                    template_folder='templates', # 模板文件的存放目录,默认值为"templates"
                    instance_path=None, # 设置配置文件的路径,在instance_relative_config=True情况下生效
                    instance_relative_config=False # 设置为True表示配置文件相对于实例路径而不是根路径
                    root_path=None) # #  应用程序的根路径
    
    • 运行测试app程序
    app.run(host=None, # 设置ip,默认127.0.0.1
            port=None, # 设置端口,默认5000
            debug=None)  # 设置是否开启调试,默认false
    

    app的配置参数详解

    flask实例化后会加载默认的配置参数,我们也可以手动设置参数更新默认的配置,常用的参数选项有:

    DEBUG:是否启用debug模式,默认false。
    TESTING	:启用/禁止测试模式
    SECRET_KEY :密钥,在启用session等很重要
    SESSION_COOKIE_NAME	:设置保存的session在 cookie 的名称
    SESSION_COOKIE_DOMAIN:设置会话的域,默认是当前的服务器,因为Session是一个全局的变量,可能应用在多个app中;设置这个参数必须设置SERVER_NAME,否则报错
    PERMANENT_SESSION_LIFETIME:session失效时间,作为一个 datetime.timedelta 对象,也可以用秒表示;
    LOGGER_NAME:日志记录器的名称,默认__name__;
    SERVER_NAME:服务器的名称以及端口,需要它为了支持子域名 (如: 'myapp.dev:5000')
    MAX_CONTENT_LENGTH:设置一个请求所允许的最大的上传数据量,单位字节;
    SEND_FILE_MAX_AGE_DEFAULT:	设置调用send_file发送文件的缓存时间;
    TRAP_HTTP_EXCEPTIONS:如果这个值被设置为 True , Flask 不会执行 HTTP 异常的错误处理, 而是像对待其它异常一样,通过异常栈让它冒泡;
    PREFERRED_URL_SCHEME:设置URL 模式用于 URL 生成。如果没有设置 URL 模式,默认将为 http 。
    JSON_AS_ASCII:默认情况下 Flask 序列化对象成 ascii 编码的 JSON。 如果不对该配置项就行设置的话,Flask 将不会编码成 ASCII 保持字符串原样,并且返回 unicode 字符串。jsonfiy 会自动按照 utf-8 进行编码并且传输。
    JSON_SORT_KEYS:默认情况下 Flask 将会依键值顺序的方式序列化 JSON。 这样做是为了确保字典哈希种子的独立性,返回值将会一致不会造成 额外的 HTTP 缓存。通过改变这个变量可以重载默认行为。 这是不推荐也许会带来缓存消耗的性能问题。
    JSONIFY_PRETTYPRINT_REGULAR:如果设置成 True (默认下),jsonify 响应对象将会完美地打印。
    

    加载配置文件的方法

    • 通过加载文件设置参数
    app.config.from_pyfile("./config.cfg") # 指定参数的路径,内容按行书写,配置文件放置在与app的同目录下
    
    def from_pyfile(self, filename, silent=False):
        filename = os.path.join(self.root_path, filename)
        pass
    
    • 通过类设置参数

    注意所有的参数必须大写,否则无效。

    class Config(object):  # 该类可以定义在一个py文件中然后导入py文件
        """配置参数"""
        DEBUG = True
    app.config.from_object(Config)
    
    
    • 通过json格式的文件配置
    # config.json
    {
        'DEBUG' = True
    }
    app.config.from_json('config.json') # 配置文件放置在与app的同目录下
    
    • 直接操作app.config对象进行设置
    app.config["DEBUG"] = True
    或者
    app.config.update({
        "DEBUG":True,
    })
    

    获取配置参数的方法

    app.config.get("DEBUG")
    或者
    current_app.config.get("DEBUG")
    

    定义视图函数

    # 使用methods参数设置
    @app.route('/',methods=["POST","GET"])
    def index():
        return 'ok'
    

    route装饰器会将其装饰的视图函数注册到app的视图函数集中,其主要有三个参数:

    rule:api路由,如:'/','/index'等;
    methods:设置允许的请求方式,如:'POST','GET'等,如果不设置,默认是GET方法;
    endpoint:视图函数的标识符,是请求用来寻找对应的视图函数的键,默认是视图函数的名字。
    

    注意点

    • 相同的路由和请求方式,先定义的覆盖后定义的,如果请求方式不同则不会覆盖;可以对不同的方式请求的分开写视图函数,但视图函数一定不能相同;

    • 同一个视图函数加了多个路由,无论哪一个都可以访问到视图;通过加多层装饰器实现;

    • 默认的请求方式为get;可以同时设置允许get和post请求访问;

    @app.route('/test',methods=["POST","GET"])
    @app.route('/',methods=["POST","GET"])
    def index():
        return 'ok'
    

    路由分发

    • 步骤:通过程序实例的route装饰器实现;route装饰器内部会调用add_url_route()方法创建一个Rule对象,将该视图函数的标识符和Rule对象作为键值对加入到app的url_map中。
    # 源码
    def route(self, rule, **options):
        def decorator(f):
                endpoint = options.pop('endpoint', None)
                self.add_url_rule(rule, endpoint, f, **options)
                return f
            return decorator
    

    路由参数转换器

    flask允许将参数放置在路由中,通过路由转换器来提取参数。

    • 默认的参数转换器
    # 将路由转化为int类型的参数
    @app.route('/user/<int:id>')
    def hello_itcast(id):
        return 'ok %d' %id
    

    <>这种形式写法就是转换器,有int,float,path,default,uuid等几种;

    int : 提取整形
    float: 提取浮点数
    path: 提取路径,包括/
    string:提取字符串
    default:即不写类型<id>,除了/之外,默认是字符串
    uuid:接受 UUID 字符串
    
    • url的规则细节
    1. 如果url规则以/结尾,请求url没有斜线,则引导到有斜线的页面;

    2. 如果url规则结尾没有斜线,请求带有斜线,则找不到页面;

    获取请求数据

    # 导入请求对象request,该对象保存了一切请求的信息
    from flask import request
    
    request.args:获取路径请求的参数,返回一个字典;
    request.form:获取表单数据;
    request.values:包含from和args的全部内容;
    request.cookies:获取cookie得到一个dict;
    request.data:获取数据作为字符串存于此;
    request.headers:获取请求头;
    request.files:获取上传的文件;
    

    返回响应数据

    在视图函数中返回的数据默认是一个三个元素的元组,分别表示返回的数据body,返回状态码和添加头部信息。

    @app.route('/')
    def index():
        return 'ok',200,[("a", "b")] # 列表
        # return 'ok',200,{"a":"b"}  # 字典
        # return 'ok',"666 hhhh",{"a":"b"}  # 状态码可以随便,不会报错
    

    也可以使用make_response()返回,其会直接创建一个response对象。

    @app.route('/')
    def test():
        return make_response('ok',200,{'a':'b'})
    

    自定义异常处理

    所有自定义的异常处理函数会加载到app对象的error_handler_spec属性中保存。

    @app.errorhandler(404) # number表示自定义的状态码
    def handle_errer(errer):
        return errer  # 表示错误的信息
    # 定义好后,当使用abort函数时,会自动调用这个处理函数;
    

    设置cookie和session

    • 设置coookie
    response.set_cookie(key,value,max_age=10) # 设置cookie的键和值,过期时间
    # 可以直接设置
    response.header["Set-Cookie] = value 
    # 获取cookie
    response.cookie.get(key)
    # 删除cookie
    response.delete_cookie(key) # 设置过期时间
    
    • session需要配置secret_key参数
    import flask import session
    # 设置加密的密匙
    app.config["SECRET_KEY"] = “password”
    name = session.get("xx") # 获取session中的数据
    session.values() # 获取session中的所有键的值
    session.keys() # 获取session中的所有键
    session.items() # 获取session中的所有键值对
    

    session默认保存在cookie中;通过加密的方式来确保session不被更改;

    参考

  • 相关阅读:
    Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换
    安卓开发中非常炫的效果集合
    Android开源项目分类汇总
    Linux vim 底下显示行号
    backslash and newline separated by space
    LinuxC语言读取文件,分割字符串,存入链表,放入另一个文件
    Linux C 知识 char型数字转换为int型 int型 转换为Char
    Linux 底下使用C 对文件进行遍历
    Xshell 中文乱码
    Linux底下的第一个C程序
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/8916575.html
Copyright © 2011-2022 走看看