Flask
-
项目结构
projectName | - app # 应用程序包 | - templates # jinjia2模板 |- static # css,js 图片等静态文件 | - main # py程序包 ,可以有多个这种包,每个对应不同的功能 | - __init__.py |- errors.py |- forms.py |- views.py |- __init__.py # 应用程序初始化的引用 |- email.py # 邮件处理程序 |- models.py # 数据库模型 |- migrations # 数据迁移文件夹 | - tests # 单元测试 |- __init__.py |- test*.py # 单元测试程序,可以包含多个对应不同的功能点测试 |- venv # 虚拟环境 |- requirements.txt # 列出了所有依赖包以及版本号,方便在其他位置生成相同的虚拟环境以及依赖 |- config.py # 全局配置文件,配置全局变量 |- manage.py # 启动程序
-
基本配置
-
全局config配置
import redis class Config: '''配置信息''' DEBUG = True SECRET_KEY = "skfhdkjcb1234KNNBJ*KLJ" # 是被flask和扩展用于保证数据安全 # 邮箱 MAIL_SERVER = 'smtp.qq.com' MAIL_PORT = 465 # 如果启用ssl其值是465,如果不启用 请用25 MAIL_USE_TLS = False MAIL_USE_SSL = True MAIL_USERNAME = 'xxxxxx' # 邮箱账号 MAIL_PASSWORD = 'xxxxxxx' # stmp密码 FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]' FLASKY_MAIL_SENDER = '[email protected]' # 邮箱地址 FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN') # 数据库 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@host:port/database' SQLALCHEMY_TRACK_MODIFICATIONS = True # 设置为True,Flask-SQLAlchemy将跟踪对象的修改并发出信号 # redis REDIS_HOST = "redis host" REDIS_PORT = 6379 # flask-session 配置 SESSION_TYPE = "redis" SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT) SESSION_USE_SIGNER = True # 对cookie中的session_id 进行隐藏处理 PERMANENT_SESSION_LIFETIME = 86400 class DevelopmentConfig(Config): '''开发模式的配置信息''' pass class ProductionConfig(Config): '''生产环境配置''' DEBUG = False config_map = { "develop": DevelopmentConfig, "product": ProductionConfig }
-
app的__init__.py配置
import redis from flask import Flask import config from exts import db, session, csrf, mail # 创建redis连接对象 redis_store = None def create_app(config_name): app = Flask(__name__, template_folder='../templates', static_folder='../static') # 根据配置模式获取配置参数 config_class = config.config_map.get(config_name) app.config.from_object(config_class) # 初始化数据库映射关联 db.init(app) # 初始化redis global redis_store redis_store = redis.StrictRedis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT) # 初始化flask-session,将session保存到redis中 session.init_app(app) # 补充csrf防护 csrf.init_app(app) # 邮箱 mail.init_app(app) return app
-
-
Flask基本知识
-
路由
- 使用route()装饰器用于注册给定的URL规则(字符串),实现视图功能。
- 通过把URL的一部分变为 <变量> 其中的变量将作为关键字参数传递给函数。
- 如果URL的尾部带有 /,则是唯一的URL,若果没有,则会重定向。
- url_for() 反转函数用于构建制定函数的URL。避免了硬编码以及修改的不方便性。
@app.route('/') # 路由 def index(): return "Index" @app.route('/post/<int:post_id>') # 变量和规则 def show_post(post_id): # return 'Post %d' % post_id @app.route('/login') def login(): return url_for("index") # 反转url_for
-
请求与响应
-
request
- 是服务器对浏览器请求的封装,用来取出请求信息
- Form 属性处理前端页面传输的表单数据。
- args 解析查询字符串的内容,是指在URL的(?)之后的一部分URL
- Cookies 保存会话内容的数据。
- files 上传与文件有关的数据。
- method 当前的请求方法。
@app.route('/login', methods=['POST', 'GET']) def login(): error = None if request.method == 'POST': if valid_login(request.form['username'], request.form['password']): # form 的使用 file = request.files['fiels'] file.save('/var/www/uploads/' + secure_filename(file.filename)) # 如果想要把客户端的文件名作为服务器上的文件名并保证安全性可以采用secure_filename() 函数 username = request.cookies.get('username') # 读取cookies resp = make_response(render_template(...)) # 存储cookies resp.set_cookie('username', 'the username') return resp
-
Response
- 是服务器对服务器响应的封装,用来添加要返回给浏览器的一个HTTP的响应信息。
- HTTP响应包含状态行、消息爆头、空行和响应正文。
- 使用 make_response() 函数构建响应信息
- jsonify() 函数包装dumps()后有添加了一些曾庆功能,他将json输出转换为Response的对象,而且还将多个参数转换为数组,或将多个关键字参数转换为dict。
# response.data:获取二进制的响应body数据 # response.data = ‘xxx’ :设置响应body数据 # response.calculate_content_length:获取响应的总字节数 # response.header:获取响应对象的头部信息 # response.status:获取字符串格式的响应状态码 # response.status_code:获取int格式的响应状态码 # response.freeze():将响应对象序列化,返回None # response.set_cookie():设置cookie(重点) # response.delete_cookie():删除cookie,将cookie设置为立即失效(重点) @app.route("/index") def index(): resp = make_response("index page 2") resp.status = "999 itcast" # 设置状态码 resp.headers["city"] = "cq " # 设置响应头 resp.set_cookie("kl", "wjdh") # 设置cookies值 return resp # jsonify @app.route('/_get_current_user') def get_current_user(): return jsonify(username=g
-
-