Flask框架基础学习一
- 官方文档:https://dormousehole.readthedocs.io/en/latest/
安装Flask
pip install flask
使用Flask和Flask的相关配置
-
小试牛刀: 创建一个flask
-
from flask import Flask # 实例化Flask对象 app = Flask(__name__) @app.route('/index') def index(): return 'Hello Flask!!!' if __name__ == '__main__': app.run() # 启动服务
-
flask实例化配置
import_name
: Flask程序所在包,正常使用__name__就行,可以决定静态文件查找的路径。static_path
: 静态文件访问路径(不推荐使用, 一般使用static_url_path代替)static_url_path
: 静态文件访问路径,不传默认是: / + static_folderstatic_folder
: 静态文件存储的文件夹,不传默认是statictemplate_folder
: 模板文件存储的文件夹,不传默认是templates
app = Flask(__name__)
flask默认配置项
class Config:
'DEBUG': False, # 启用/关闭调试模式
'TESTING': False, # 启用/关闭测试模式
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None, # 秘钥
'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), # 控制session的有效时间
'USE_X_SENDFILE': False, # 启用/禁用 x-sendfile
'LOGGER_NAME': '__main__', # 日志记录器的名称
'LOGGER_HANDLER_POLICY': 'always',
'SERVER_NAME': None,
'APPLICATION_ROOT': None,
'SESSION_COOKIE_NAME': 'session', # session存储在浏览器的名称
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200),
'TRAP_BAD_REQUEST_ERRORS': False,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': True,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None
注意: host和port只可以配置在run中
路由的使用
参数
-
不传参的路由
-
@app.route('/index') def index(): return 'ok'
-
-
不限定类型的传参
-
@app.route('/user/<phone>') def user(phone): print(phone) return 'ok'
-
-
限定类型的传参
-
""" string 默认类型,不带斜杠的任何文本 int 正整数 float 正浮点数 path 接收string同时也接受斜线 uuid 接受UUID,类似于xxxx-xxxx-xxxx-xxxx """ @app.route('/user/<int:phone>') # 指定正整数 def user(phone): print(phone) return 'ok'
-
-
自定义类型的传参
-
from werkzeug.routing import BaseConverter # 导入一个基本类 # 定义 class MyConverter(BaseConverter): def __init__(self, map, *args): super().__init__(map) self.regex = args[0] app.url_map.converters['phone_format'] = MyConverter # 使用 @app.route('/user/<phone_format(r"1[3-9]\d{9}"):phone>') def user(phone): print(phone) return 'ok'
-
请求方式
from flask import Flask, request
@app.route(rule="/user", methods=["post","put","get","delete","patch"])
def user():
print(request.url)
return request.method
http的请求与响应
请求request
-
导入:
from flask import request
-
属性介绍
-
""" data 请求体的数据 bytes form 请求中的html表单数据 MultiDict args 请求中的查询字符串 MultiDict cookie 请求中cookie信息 Dict headers 请求中的请求头 EnvironHeaders method 请求使用的HTTP方法 GET/POST url 请求的URL地址 string files 请求上传的文件列表 * json ajax请求的json数据 json """
-
-
访问的url: http://127.0.0.1:5000/user_request?aaa=1&credit=0&coupon=1&aaa=22
-
@app.route('/user_request', methods=['GET', 'POST']) def user_request(): print(request.args) # ImmutableMultiDict([('aaa', '1'), ('aaa', '22'), ('credit', '0'), ('coupon', '1')]) print(request.args.get('aaa')) # 1 print(request.args.getlist('aaa')) # ['1', '22'] print(request.args.to_dict(flat=False)) # {'aaa': ['1', '22'], 'credit': ['0'], 'coupon': ['1']} print(request.args.to_dict(flat=True)) # {'aaa': '1', 'credit': '0', 'coupon': '1'} print(request.args.to_dict()) # {'aaa': '1', 'credit': '0', 'coupon': '1'} 默认是True return 'ok'
-
响应response
-
导入:
from flask import make_response
-
响应html文件
-
@app.route('/index') def index(): response = make_response('<h1>Hello</h1>') return response # 返回模板文件 from flask import render_template @app.route('/data') def data(): return render_template('index.html') # ./templates/index.html
-
-
响应JSON数据
-
from flask import jsonify # 导入 @app.route('/index') def index(): data = [ {'id': 1, 'name': 'aaa', 'age': 2}, {'id': 2, 'name': 'bbb', 'age': 22}, {'id': 3, 'name': 'ccc', 'age': 222}, {'id': 4, 'name': 'ddd', 'age': 2222} ] return jsonify(data)
-
-
重定向
-
301永久重定向,302临时重定向
-
from flask import redirect @app.route('/red') def red(): return redirect("http://www.baidu.com", 301) # return redirect("http://www.baidu.com") # 不加默认是302 # 使用url_for实现视图内部跳转 from flask import url_for @app.route('/red') def red(): return redirect(url_for('index')) # url_for(视图方法名)
-
-
自定义响应头和状态码
-
@app.route('/rep') def rep(): response = make_response('ok') response.headers['Company'] = 'haha' # 自定义响应头 response.status_code = 400 # 自定义状态码 return response
-
-
返回图片到浏览器
-
@app.route('/img') def img(): with open('./a.jpg', 'rb') as fp: img_data = fp.read() response = make_response(img_data) # response.headers['Content-Type'] = 'application/zip' # 用户访问会自动下载文件为zip文件 response.headers['Content-Type'] = 'image/jpeg' # 将图片显示在浏览器中 return response # 使用send_file from flask import send_file @app.route('/img_2') def img_2(): return send_file('a.jpg')
-
cookie的使用
-
设置cookie
-
@app.route('/set_cookie') def set_cookie_self(): # 设置cookie response = make_response('ok') response.set_cookie('name', 'aaa', 100) # 100代表cookie有效期,单位秒,不加代表永久有效 response.set_cookie('age', '24') return response
-
-
获取cookie
-
@app.route('/get_cookie') def get_cookie_self(): # 获取cookie print(request.cookies) # ImmutableMultiDict([('name', 'aaa'), ('age', '24')]) print(request.cookies.get('name')) # aaa print(request.cookies.get('age')) # 24 return 'ok'
-
-
删除cookie
-
@app.route('/del_cookie') def del_cookie_self(): # 删除cookie response = make_response('ok') response.set_cookie('name', '', 0) # 设置有效期为0,可以达到删除的效果 return response
-
session的使用
-
设置session
-
class Config: SECRET_KEY = '123456AAAaaa' # 秘钥 ESSION_COOKIE_NAME = 'xxx' # 设置session在浏览器中存储的key名 # 设置session的有效期,默认是31天 # session.permanent = True # PERMANENT_SESSION_LIFETIME: datetime.timedelta(31) app.config.from_object(Config) @app.route('/set_session') def set_session_self(): # 设置session session['name'] = 'aaa' session['info'] = { 'age': 24, 'sex': True } return 'ok'
-
-
获取session
-
@app.route('/get_session') def get_session_self(): # 获取session print(session) # <SecureCookieSession {'info': {'age': 24, 'sex': True}, 'name': 'aaa'}> print(session.get('name')) # aaa print(session.get('info')) # {'age': 24, 'sex': True} return 'ok'
-
-
删除session
-
@app.route('/del_session') def del_session(): # 删除session try: # del session['name'] # 删除单个 session.clear() # 删除所有 except Exception as e: print(e) pass return 'ok'
-
-
session的登录校验
-
from flask import Flask, render_template, request, session, url_for, redirect from functools import wraps app = Flask(__name__) class Config: DEBUG = True SECRET_KEY = '123456AAAaaa' app.config.from_object(Config) @app.route('/index') def index(): return render_template('index.html') @app.route('/login', methods=['POST', 'GET']) def login(): name = request.form.get('uname') pwd = request.form.get('pwd') radio = request.form.get('radio') if name == 'aaa' and pwd == '123': if radio: session['uname'] = 'aaa' session['pwd'] = '123' return '登录成功' else: return '登录失败' def my_session(func): @wraps(func) def inner(*args, **kwargs): if session.get('uname'): # 如果存在uname,说明已经登录 ret = func() return ret else: # 没有uname,说明没登录,重定向到登录页面 return redirect(url_for('index')) return inner @app.route('/main1') @my_session # 添加登录验证装饰器 def main1(): return 'main1' @app.route('/main2') @my_session def main2(): return 'main2' if __name__ == '__main__': app.run()
-