flask学习第一天

2018-12-19  本文已影响0人  楠木cral

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文件用来执行整个项目的:第一天的学习大致构架如图:

image.png

三、各个文件的实现功能简介
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

上一篇下一篇

猜你喜欢

热点阅读