1. Flask基础知识
Posted 草民不吃草
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1. Flask基础知识相关的知识,希望对你有一定的参考价值。
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替换。」
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)请求与响应
「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基础知识的主要内容,如果未能解决你的问题,请参考以下文章