flask学习第一天
title: flask框架学习day01
tags:
grammar_cjkRuby: true
主要内容:虚拟环境的搭建,路由模块化管理(Blueprint),请求与响应,flask-script
一、虚拟环境的搭建
flask的虚拟环境搭建和django差不多,安装好virtualenv,创建虚拟环境,安装flask。和django一样,将虚拟环境和代码分开放,在易记的位置分别创建env和workespace文件夹分别装虚拟环境和代码
1.安装virtualenv
在自定义的env文件夹下 执行pip install virtualenv
2.创建名为flaskenv的虚拟环境
virtualenv --no-site-packages -p path(python3的路径) flaskenv
3.安装flask
在进入flaskenv的Script(cd env/Script),执行activate命令进入虚拟环境状态,执行 pip install flask
4.进入workspace文件夹建立装代码的项目名文件夹day01(自己定义)
5.在可视化软件(例如pycharm)进行解释器配置(在django环境配置有): https://www.jianshu.com/p/e10cbaa733a5
二、flask项目基本构架
1.flask其实和django框架差不多,只是django的model/views/app/...等都已经有了,我们只需要在里面写内容就好了,而flask就需要我们自己写这些,从而也避免了很多不用的和一些不必要的文件存在项目中,只需要写这个项目需要的模块,轻便很多。
2.新建app文件包(python package),这个包文件夹自带init.py文件的,用来存放views等py文件,新建utils文件包用来存放修饰器等外部函数的,新建templates文件夹用来存放html前端页面文件的,新建好views.py、新建manage.py文件用来执行整个项目的:第一天的学习大致构架如图:
三、各个文件的实现功能简介
1.manage.py
(1)在manage.py,先在命令界面terminal中安装 pip install flask-script,然后引入flask和Manager和配置执行项目:
from flask import Flask
from flask_script import Manager
from app.views import blueprint
# 项目对象
app = Flask(__name__)
# 第二步:注册蓝图
app.register_blueprint(blueprint=blueprint, url_prefix='/app')
# 在flask项目中,Session, Cookies以及一些第三方扩展都会用到SECRET_KEY值,这是一个比较重要的配置值(增加session值的复杂度)
app.secret_key='shfkushfijhsauyfgahfu65464694451436513'
manage = Manager(app)
if __name__ == '__main__':
# 传入参数修改ip端口等
# app.run(host='0.0.0.0', port=8000, debug=True)
manage.run()
2.views.py
在这个文件里面主要进行路由管理(使用Blueprint)和各个功能函数管理
(1)首先安装Blueprint,在命令行中执行pip install flask-blueprint
(2)然后引入它:from flask import Blueprint,再生成蓝图对象:blueprint = Blueprint('first', name),这个“first“是自己命名,后面会用到
(3)然后在manage.py,从views引入:from app.views import blueprint中,然后注册蓝图:app.register_blueprint(blueprint=blueprint, url_prefix='/app'),
(4)最后进行路由管理
# pip install flask-blueprint
from flask import Blueprint, url_for, make_response, request, render_template, session
from werkzeug.utils import redirect
from utils.functions import login_required
# 模块化管理路由Blueprint
# 第一步:生成蓝图对象
blueprint = Blueprint('first', __name__)
@blueprint.route('/hello/')
def hello():
return 'Hello World!'
@blueprint.route('/redirect/')
def my_redirect():
# redirect:跳转
# url_for:反向解析
# 'first.hello' :蓝图的第一个参数,
return redirect(url_for('first.hello'))
@blueprint.route('/stu/<id>/')
def stu(id):
# 接受参数为字符串
return 'stu id: %s' % id
@blueprint.route('/redirect_id/')
def stu_redirect():
return redirect(url_for('first.stu', id=3))
@blueprint.route('/make_response/')
def my_response():
# make_response 创建响应
# 第一个参数:响应内容
# 第二个参数:响应状态码
res = make_response('<h2>今天天气很不错<h2>')
# 设置cookie,max_age以秒为单位,expires以datetime为单位
res.set_cookie('token', '123456', max_age=6000)
return res
@blueprint.route('/del_cookie/')
def del_cookie():
# make_response 创建响应
# 第一个参数:响应内容
# 第二个参数:响应状态码
res = make_response('<h2>删除cookie<h2>')
# 设置cookie,max_age以秒为单位,expires以datetime为单位
res.delete_cookie('token')
return res
@blueprint.route('/req/', methods=['GET', 'POST', 'PUT', 'PATcH']) # 自定义接受的请求方式
def req():
if request.method == 'GET':
# 获取GET请求中传递的参数request.args.get()
# 获取GET请求中name=小明&name=小花中的name参数request.args.getlist('name')
return 'Hello get!'
if request.method == 'POST':
# 获取POST请求中传递的参数,request.form
# 获取值:request.form.get(get)或request.form.getlist()
return 'Hello post!'
@blueprint.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
if request.method == 'POST':
# 模拟登陆
username = request.form.get('username')
password = request.form.get('password')
if username == 'fzx' and password == '123456789':
session['user_id'] = 1
return redirect(url_for('first.index'))
#1.登录校验
@blueprint.route('/index/')
@login_required
def index():
return render_template('index.html')
3.functions
实现登陆校验等外部函数
from flask import session, redirect, url_for
# 条件
# 外层函数嵌套内层函数
# 外层函数返回内层函数
from functools import wraps
def login_required(func):
@wraps(func)
def inner():
if 'user_id' in session:
return func()
else:
return redirect(url_for('first.login'))
return inner