Flask学习笔记

1. Flask基础知识

2021-07-27  本文已影响0人  村长1011

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')
上一篇下一篇

猜你喜欢

热点阅读