1. Flask基础知识

作者: 村长1011 | 来源:发表于2021-07-27 23:16 被阅读0次

    1. Flask的web服务器

    1)WSGI

    Python Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它的可移植性方面的目标。
    WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。
    WSGI标准在 PEP 333 中定义并被许多框架实现,其中包括现广泛使用的django框架。
    flask模块中已有默认的服务器,可被Nginx、uWSGI替换。

    web服务器,web框架与 WSGI之间的关系

    2. Flask请求与响应

    1)flask服务配置 host、port、debug

    from flask import Flask
    app = Flask(__name__)
    
    # Flask配置有3种方式
    # 第一种配置方式
    print(app.config)   # <Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093}>
    app.config['ENV'] = 'development'
    app.config['DEBUG'] = True
    
    # 第二种配置方式(推荐使用)
    # 配置解耦,一般写在单独的文件中(settings.py)
    # import settings
    # app.config.from_object(settings)  # 可直接导入settings内容 # debug:True,代码改变后,服务自动重新加载,适用于development环境
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    if __name__ == '__main__':
        # port:指定端口
        # host:默认只能本机访问,'0.0.0.0'可以供外网访问
        app.run(port=8001, host='0.0.0.0') # port与host一般直接写在这里
    
        # 第三种配置方式,直接配置在run方法中
        # app.run(port=8001, host='0.0.0.0', debug=True)
    

    2)请求与响应

    request 请求
    请求行:
    - 请求地址:http://127.0.0.1:8001/
    - 请求方法:GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE
    请求头:是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
    请求体:是报文体,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过GET请求方式传递请求参数。

    reponse 响应
    响应体:响应内容
    响应头:通过字典的形式设置响应头
    状态码: 200、404、500、302

    请求与响应
    注意:
    return 返回的字符串,实际上做了一个response对象的封装,最终的返回结果还是response对象。
    from flask import Flask, Response
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        # return 'Hello World!'
        return Response('Hello World!')  # 返回response对象
    
    if __name__ == '__main__':
        app.run(port=8001, host='0.0.0.0')
    

    3. Flask路由和变量规则

    1)路由

    现代 web 应用都使用有意义的 URL ,这样有助于用户记忆,网页会更得到用户的青睐, 提高回头率。
    使用 route() 装饰器来把函数绑定到 URL:

    # 使用装饰器原理
    @app.route('/hello')
    def hello():
        return 'Hello, World'
    
    # 实际上,就是将rule字符与视图函数进行了绑定,通过add_url_rule()实现的绑定
    # 下面路由实现方式等效于上面的
    def hello():
        return 'Hello, World'
    app.add_url_rule('/hello', view_func=hello)
    

    2)路由的变量规则

    通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 <converter:variable_name> ,可以选择性的加上一个转换器,为变量指定规则。

    from markupsafe import escape
    
    @app.route('/user/<username>')
    def show_user_profile(username):
        # show the user profile for that user
        return f'User {escape(username)}'
    
    @app.route('/post/<int:post_id>')
    def show_post(post_id):
        # show the post with the given id, the id is an integer
        return f'Post {post_id}'
    
    @app.route('/path/<path:subpath>')
    def show_subpath(subpath):
        # show the subpath after /path/
        return f'Subpath {escape(subpath)}'
    
    '''
    转换器类型:
     string:(缺省值) 接受任何不包含斜杠的文本
     int:接受正整数
     float:接受正浮点数
     path:类似 string ,但可以包含斜杠
     uuid:接受 UUID 字符串
    '''
    

    注意:
    访问一个没有斜杠结尾的 URL ( /projects )时 Flask 会自动进行重 定向,帮您在尾部加上一个斜杠( /projects/ )。
    如果访问 URL 时添加了尾部斜杠( /about/ ),而路由的代码中未添加‘/’( /about ),就会得到一个 404 错误。

    4. Response、Request 对象

    1)定制响应头

    from flask import make_response
    
    @app.route('/test1/')
    def test_func1():
        content = '测试'
        response = make_response(content)
        response.headers['dingzhi-1'] = '123'
        response.headers['dingzhi-2'] = '456'
        response.set_cookie('test', '123456')
        return response
    
    response对象的方法:
    #   **response**
    #   **status**    200  OK
    #   **status_code**    200
    #   **headers** 
    #   **mimetype**
    #   **content_type**
    #   **direct_passthrough**
    #   **set_cookie**
    
    定制响应头

    2)request属性

    Flask request 属性详解

    1、method:请求的方法
    return request.method        #POST
    
    2、form:返回form的内容
    return json.dumps(request.form)        #{"username": "123", "password": "1234"}
    
    3、args和values:args返回请求中的参数,values返回请求中的参数和form
    return json.dumps(request.args)       
    #url:http://192.168.1.183:5000/login?a=1&b=2、返回值:{"a": "1", "b": "2"}
    print(request.args['a'])
    #输出:1
    return str(request.values)        
    #CombinedMultiDict([ImmutableMultiDict([('a', '1'), ('b', '2')]), ImmutableMultiDict([('username', '123'), ('password', '1234')])])
    
    4、cookies:cookies信息
    return json.dumps(request.cookies)        #cookies信息
    
    5、headers:请求headers信息,返回的结果是个list
    return str(request.headers)        #headers信息
    request.headers.get('User-Agent')        #获取User-Agent信息
    
    6、url、path、base_url、url_root:
    request.url: http://192.168.1.183:5000/testrequest?a&b , 
    request.path: /testrequest , 
    request.base_url: http://192.168.1.183:5000/testrequest , 
    request.url_root : http://192.168.1.183:5000/
    
    7、date、files:date是请求的数据,files随请求上传的文件
    @app.route('/upload',methods=['GET','POST'])
    def upload():
        if request.method == 'POST':
            f = request.files['file']
            filename = secure_filename(f.filename)
            #f.save(os.path.join('app/static',filename))
            f.save('app/static/'+str(filename))
            return 'ok'
        else:
            return render_template('upload.html')
    

    相关文章

      网友评论

        本文标题:1. Flask基础知识

        本文链接:https://www.haomeiwen.com/subject/vgvimltx.html