Flask框架

  1.安装命令: pip install flask

  2.使用

    1.自己的app

    

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

  2.底层代码2(了解)

from wsgiref.simple_server import make_server

def mya(environ, start_response):
    print(environ)
    start_response('200 OK', [('Content-Type', 'text/html')])
    if environ.get('PATH_INFO') == '/index':
        with open('index.html','rb') as f:
            data=f.read()

    elif environ.get('PATH_INFO') == '/login':
        with open('login.html', 'rb') as f:
            data = f.read()
    else:
        data=b'<h1>Hello, web!</h1>'
    return [data]

if __name__ == '__main__':
    myserver = make_server('', 8011, mya)
    print('监听8011')
    myserver.serve_forever()

  底层实现代码2

  3. Flask的四大剑客(jdango 的三板斧)

from flask import Flask, render_template, redirect, jsonify

# 四剑客 render_template, redirect, jsonify
app = Flask(__name__)


@app.route('/')
def task1():
    # 1.直接返回字符串
    # return '字符串'

    # 2.html页面
    my_dict = {"name":"coco"}
    # return render_template('index.html',name='Tom',n_dict=my_dict)


    # 3/页面进行跳转
    # return redirect('/login')


    # 4.返回json 格式的数据
    name_dict = [{'name':"coco_nb"},{'name':"Sam"}]
    return jsonify(name_dict)
    # [{"name":"coco_nb"},{"name":"Sam"}] 标准的jsonify 格式字符串


@app.route('/login')
def login():
    # return  'flask_login'  # 直接天转我们的代码实现页面或功能体代码的执行
   return render_template('login.html')  #

  

  

  

from flask import Flask
# 生成一个Flask 类的对象  >>> 封装成用一个类
app = Flask(__name__)  # 当前文件 实列化
# 补充: 我们有Mvc>>> model view contral和Fvc
@app.route('/')
def work1():
    return 'OKle'  # >>> 直接返回一个字符串


if __name__ == '__main__':

    app.run()

    # 本质是:run_simple(host,port,app,**optons >位置参数)
    # 对象点run()的方法 执行
    # app() 对象 ,执行__call__

  4.四种配制DEBUG 的时时更新的方法(刷新服务器的作用)

from flask import Flask,render_template,redirect, jsonify
app = Flask(__name__)
# 这是第一种配制debug
# app.debug=True
# app.secret_key = '12312312'

# 这是第二种
# app.config['Debug'] = True

# 第三种 debug 时时刷新配置 以文件的形式
# app.config.from_pyfile('settings.py')

# 第四种配置我们的DEBUG 时时更新 改配置代码就要记得时时刷新 IO 类CTR+S 保存就会时时刷新
# 第四种一类的形式是我们推荐的一种模式

app.config.from_object('settings.DevelopmentConfig')

@app.route('/')
def task1():
    
    return redirect('/login')


@app.route('/login')
def login():
    print(2)
    return render_template("login.html")




@app.route('/register')
def register():
    return 'register'


if __name__ == '__main__':
    print('hahah')
    app.run()

  4.路由配置的两种方式

  第一 装饰器

  @app.router('/路由',methods=['get','post'],endpoint='dbs')

  def  ():

    return redirect('/login')


  第二 起别名 (反向解析)app.add_url_rule() 其实和装饰器的一样的

  

  app.add_url_rule('/login/<string:nid>', view_func=login, endpoint='dbs', methods=['GET','POST'])
# 起别名
from flask import Flask, url_for,render_template,redirect
app = Flask(__name__)
app.debug=True

# @app.route('/login',methods=['GET','POST'], endpoint='dsb')
#
# rule >>> 路由
# endpoint >>> 起别名
# methods = ['GET',POST]
# view_fun=就是我们endpoint  我们的函数名 也就是请求改路由的的时候 要响应改函数
# 反向解析


def login(nid):
    print(type(nid),nid)
    return 'obj_login'


app.add_url_rule('/login/<string:nid>', view_func=login, endpoint='dbs', methods=['GET','POST'])
"""
取别名

"""
# 第二 起别名(反向解析)



def register():
    return 'ko'
app.add_url_rule('/register',view_func=register, endpoint='dbs')


def index():
    real_url = url_for('sbs')

    return redirect(real_url)

app.add_url_rule('/index',view_func=index,methods=['GET','POST'])
if __name__ == '__main__':
    app.run()
#
# 每一个视图都可以注册蓝图
from flask import Blueprint, url_for

blog = Blueprint('blog', __name__)  # 注册蓝图

@blog.before_request
def a():
    print('blog中的请求扩展')


@blog.route('/index')
def index():
    print(url_for('acc.login'))
    return 'ko'

  

  5.cbv类Flask 的执行

# CBV与fbv

 

# CBV与fbv
from flask import Flask,views

app = Flask(__name__)
app.debug = True

class IndexView(views.View):
    methods = ['GET','POST']
    def dispatch_request(self):
        print('123')
        return '不会走get post '
    def get(self):
        print('111')
        return '1111'
    def post(self):
        print(222)
        return '2222'
#IndexView.as_view(name='index')都views.View里面的as_view的view
#为什么要as_view(name='index'),
#如果不指定,就都是view
#所以必须指定

app.add_url_rule('/register', view_func=IndexView.as_view(name='register'))

if __name__ == '__main__':
    app.run()

  继承MethodView 实现get post 请求

# CBV与fbv
from flask import Flask,views

app = Flask(__name__)
app.debug = True

class IndexView(views.MethodView):
    methods = ['GET','POST']
    # def dispatch_request(self):
    #     print('123')
    #     return '不会走get post '
    def get(self):
        print('111')
        return '1111'
    def post(self):
        print(222)
        return '2222'
#IndexView.as_view(name='index')都views.View里面的as_view的view
#为什么要as_view(name='index'),
#如果不指定,就都是view
#所以必须指定

app.add_url_rule('/register', view_func=IndexView.as_view(name='register'))

if __name__ == '__main__':
    app.run()

   作业:Flask实现登陆 用的函数的方法  第一次用的时候不知道参数从哪里来 导入request 》》》request.form.get('username')/("password")

from flask import Flask,redirect,render_template,jsonify,views,request,session,url_for
app = Flask(__name__)
# 测试用debug = True
app.debug = True
# 设置一个随机的字符串
app.secret_key='77888'
# 路由的补充


# 用户登陆
USERS = {
         1: {'name': "koko", 'password': '123'},
         2: {'name': 'coco', 'password': '456'},
         3: {"name": 'yy', 'password': '123'}}


# class LoginView(views.MethodView):
#
#     methods = ['GET', 'POST']
#
#     def post(self):
#         print('登陆页面>>>')
#         if USERS.get('nid'):
#             return '登陆成功'
#         else:
#             return '数据有误'
#
#     def get(self):
#         print('请求登陆')
#         return render_template('login.html')
#
# app.add_url_rule('/login<string:nid>', view_func=LoginView.as_view(name='login'))
@app.route('/login', methods=['GET', 'POST'], endpoint='aa')
def login():
    # 先判断用户的请求方法
    if request.method == 'GET':
    # if USERS.get(nid)
        return render_template('login.html')

    else:
        # 走POST
        # print(request.query_string)
        user = request.form.get('username')
        pwd = request.form.get('password')
        print(user,pwd)
        if user == 'koko' and pwd == '123':
            # 登陆成功设置sesion
            session['user_info'] = user
            # return redirect('htpp://www.baidu.com')
            return render_template('home.html')  # 登陆成功跳转到home 渲染一个页面
        else:

            return render_template('login.html',error ='用户名或者密码有误')

# 用户详情
@app.route('/user_detail/<string:nid>', methods=['GET'])
def detail(nid):
    # 校验session中我们自己设置的user_info cookies
    user = session.get('user_info')
    if not user:
        # 页面跳转到等页面
        # return redirect('/login')
        url = url_for('aa')  # 反向解析
        redirect(url)  # 跳转到我们的登陆页面
    else:
        # 跳转到我们的用户详情没面

        return render_template('user_detail.html', user_detail=USERS)

# 路由
# app.add_url_rule('/login<string:ndi>', view_func=login, endpoint='aa')

if __name__ == '__main__':
    # app() 对象加括号执行__call__ 再执行 call 下的代码
    # app.__call__

    app.run()

     补充:路由系统支持正则表达式进行匹配

  代码示例:

  后端的代码

from flask import Flask, views, url_for
# 路由匹配
from werkzeug.routing import BaseConverter

app = Flask(import_name=__name__)  # 执行文件
app.debug = True


class RegexConverter(BaseConverter):
    '''
        自定义正则匹配表达式
    '''
    def __init__(self, map, regex):
        super(RegexConverter,self).__init__(map)
        self.regex = regex

    def to_python(self, value):
        '''
        路由匹配时,
        :param value: 将值传递给视图函数
        :return: 将值回给nid 作为参数
        '''
        print(value,type(value))
        return value

    def to_url(self, value):
        '''

        :param value: 使用url_for 反向生成url时,传递的参数经过改方法的处理可以直接返回(符合四大剑客)

        :return: 使用url_for 反向生成url时,传递的参数经过改方法的处理可以直接返回(符合四大剑客)
        '''
        val = super(RegexConverter,self).to_url(value)
        print(val,8888)  # j9999 8888
        return val


app.url_map.converters['regex1'] = RegexConverter


@app.route('/index/<regex1("d+"):nid>', endpoint='dd')
def index(nid):
    print('nid', nid)   # nid 接受的值就是上面的value 的返回值
    print(url_for('dd' , nid='j9999'))  # /index/j9999
    return nid


if __name__ == '__main__':
    app.run()

    最后再测试的时候 我们发现 如果是直接请求的话那就是走的BaseCoknverters类中to_python() >>> 将处理好的结果数据传递到我们的函数 (nid) 然而url_for 是需要我们再函数中 结合url_fro(‘’dd',nid=5555(要传递给类的数据)》》》就是 通过反向解析app.url_map 执行类》》》   我们函数url_for可以将值进行返回  》》》好像没有体现任何作用啊 要获取值得话 直接用路由也可以得到前端的路由传过来的值

  6. 模板渲染的方法和Django 基本一样

from flask import Flask,render_template, Markup, template_rendered
app = Flask(__name__)
app.debug = True
# 设置一个随机的字符串
app.secret_key = 'qweqwewqe123'


USERS = {
    1:{'name':'张三','age':18,'gender':'','text':"道路千万条"},
    2:{'name':'李四','age':28,'gender':'','text':"安全第一条"},
    3:{'name':'王五','age':18,'gender':'','text':"行车不规范"},
}


def f1(t1, t2):
    return Markup(f"<h1>直接传前端要设置安全模式{t1}{t2}</h1>")

# 将这些数据传到页面进行渲染


@app.route('/test',methods=['GET'])
def test():
    info = USERS

    return render_template('test.html', info=info,html=f"<h1>直接传前端要设置安全模式</h1>",html1=f1)

@app.route('/detail<int:nid>', methods=['GET'],endpoint='bb',)
def detail(nid):
    print(nid)
    return nid
#


if __name__ == '__main__':
    app.run()

  前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
    {% for k,v in info.items() %}
        <tr>
            <td>{{k}}</td>
            <td>{{v.name}}</td>
            <td>{{v['name']}}</td>
            <td>{{v.get('name')}}</td>
            <td><a href="{{url_for('bb',nid=44438)}}">查看详细</a></td>
        </tr>
{% endfor %}
{{html|safe}}
{{html1("-dsb","-svb")}}

</body>
</html>

  7.请求响应

@app.route('/login.html', methods=['GET', "POST"])
def login():
    # 请求相关信息
    #提交的方法
    print(request.method)
    # request.args  get请求提及的数据
    print(request.args)


    # request.url           带域名带参数的请求路径
    # request.base_url      带域名请求路径
    # request.url_root      域名
    # request.host_url      域名
    # request.host          127.0.0.1:500
    # request.files
    # obj = request.files['the_file_name']
    # obj.save('/var/www/uploads/' + secure_filename(f.filename))

    # 响应相关信息
    # return "字符串"
    # return render_template('html模板路径',**{})
    # return redirect('/index.html')
    # return jsonify({'k1':'v1'})

    #response = make_response(render_template('index.html'))
    # response是flask.wrappers.Response类型
    # response.delete_cookie('key')
    # response.set_cookie('key', 'value')
    # response.headers['X-Something'] = 'A value'
    # return response
    #1导入make_response
    #2response=make_response(4剑客)
    #3 操作response
    # return response

  8.session 的存取

  走源码

  

  response = make_response(render_template('index.html'))  


  response.set_cookie('koko','nd')  # 设置cookie


    response.delete_cookie('key')   # 删不了 ??? 

   response.headers['X-Something'] = 'A value sbwewewe'
    return 'ko'

  


def open_session(self, request):
def save_session(self, session, response):
# 设置 和 获取
from flask import Flask,session
app = Flask(__name__)
app.debug = True
app.secret_key = '234324'
app.config['SESSION_COOKIE_NAME'] = 'kk'  # 控制session 的key


@app.route('/test1',strict_slashes=Flask)
def test():
    session['kk3543'] = 'yy'  # 存值 以上免的key 为准

    print(12321)


    return 'ok'

@app.route('/test2',strict_slashes=Flask)
def index():
    print(session['kk3543'])  # 取值

    print(9999)
    return 'ko'



if __name__ == '__main__':
    # app.__call__
    app.run()

  9.闪现(message)

'''
什么是闪现
a 产生信息,传给 c 页面
但是用户访问a 页面以后,不是直接跳转到c,而是到b,或则是其他页面,但是用户访问c页面的时候,我希望把a给我的信息拿到

'''

from flask import Flask,flash,get_flashed_messages,request
app = Flask(__name__)
app.debug = True
app.secret_key = '2432r23r'

"""
#1 如果要用flash就必须设置app.secret_key = 'asdfasdf'
#2 只能取一次,在取就没有了
#3 我们可以通过  flash('普通信息',category="info"),对信息做分类
#4get_flashed_messages(with_categories=True,category_filter=("error",)),with_categories以键值对的形式获取
#我们设置闪现,category_filter=("error",)进行分类信息的过滤
"""
@app.route('/test1')
def test():
    # flash(message=,category=)
    flash('超时信息',category='error')
    flash('普通信息',category='info')
    return '存error成功ko'

@app.route('/error1')
def error1():
    return "ok"

@app.route('/error')
def error():
    data = get_flashed_messages(with_categories=True,category_filter=("error","info"))
    # data1 = get_flashed_messages(with_categories=True, category_filter=("error", "info"))
    # print("data1",data1)
    print("data",data)
    return "错误信息取"

if __name__ == '__main__':
    app.run()

  图文显示

   

  10.请求扩展

from flask import Flask,render_template,request

app = Flask(__name__)
app.debug = True

@app.before_request
def before1():
    print(request)
    print('请求之前的1')  # 这里请求之前 第一次first的请求之后 2
    # return '111'  # 只要在请求前有返回


@app.before_request
def before2():
    print(request)
    print('请求之前的2')  # 优先做所有的请求 才会走响应的函数
    # return '222'


@app.after_request
def after1(response):

    print('我是请求之后的1')

    return response


@app.after_request
def after2(response):

    print('我是请求之后的2')
    return response


@app.before_first_request
def before_first():
    print('123')  # 第一次请求最优先执行这里  直接走before_request() 1


@app.teardown_request
def tear(e):
    print('teardown_request')  #
    print(e,123)  # 没有返回值 None
    return 'kkk'  # 没有返回值

#捕获异常,如果出现异常,而且状态就是@app.errorhandler(404),
# @app.errorhandler(404)
# def error_404(arg):
#     print(arg)
#     return "404错误了"
#

@app.errorhandler(500)
def error(arg):
    print(arg)

    return "500错误了"


@app.template_global()  # 这里是不要进行 路由的设定 直接设置为全局 将页面的数据传到模板进行渲染即可

def ee(a1, a2):
    print(a1, a2)

    return a1 + a2




@app.route('/test')
def test():
    # asfcasc
    print('我是真的视图')

    return render_template('index.html')

@app.template_filter()
def db(a,b,c,d):
    print(a,b,c,d)
    return a+b+c+d

if __name__ == '__main__':
    app.run()

  前端的 模版渲

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>


</head>
<body>
<h1>hello</h1>
{{ee(10,20)}}

{{1|db(2,3,1)}}
</body>
</html>

  11.中间件 before 和after 中间要做的叫中间件(了解)

  12.蓝图源码

  实际开发应用 小项目 软件开发目录规范

  

     1.启动文件

# 运行文件

from pro_flask import app
if __name__ == '__main__':
    app.run()

  2 .views 中代码 

  account.py 如用户登录

#  视图执行登录功能

from flask import Blueprint
from flask import  template_rendered
from flask import request

# 注册登录视图到蓝图

account = Blueprint('acc', __name__)  # 注册和方向解析


@account.route('/login.html',methods=['GET','POST'])
def login():
    return template_rendered('login.html')  # 反向解析

  blog.py 代码的可扩展功能和 路由跳转到login页面 >>>url_for

  3.user.py 用户起的功能

from flask import Blueprint
user = Blueprint('user', __name__)

  大型项目的蓝图 Blueprint 的实际开发的模块

# 全局文件配置
from flask import Flask
from .admin import admin
from .web import web

app = Flask(__name__)  # 生成对象app
app.debug = True


# 全局注册蓝图
app.register_blueprint(admin, url_prefix='/admin')
app.register_blueprint(web, url_prefix='/web')

  

   1.run.py 启动文件

  

  

from pro_flask import app

if __name__ == '__main__':
    app.run()

`  2.__init__ 全局文件的配置

# 全局文件配置
from flask import Flask
from .admin import admin
from .web import web

app = Flask(__name__)  # 生成对象app
app.debug = True


# 全局注册蓝图
app.register_blueprint(admin, url_prefix='/admin')
app.register_blueprint(web, url_prefix='/web')

  3.admin执行文件 和web 每一文件都是一个应用 都有自己的views ,static,templates, __inti__ >>>app注册蓝图的地方

  

from flask import Flask,Blueprint
# 注册蓝图
web = Blueprint(
    'web',
    __name__,
    template_folder='template',
    static_url_path='/static',
    static_folder='static'

)

from . import view

  13.请求上下文源码分析

  14.g对象

"""

#g对象的特性:
#当前请求内你设置就可以取,必须先设置,后取,当前请求可以取无限次(一次请求,一次响应)
#就算你当前请求,设置了,如果不取,其他请求过来,也取不到

"""
from flask import Flask,g, request, redirect,render_template


app = Flask(__name__)
app.debug = True

# 设置值
@app.before_request
def set_g(): g.name = 'dsb' @app.route('/') def index(): set_g() print(g.name) # 可以无限的取 print(g.name) # 可以无限的取 print(g.name) # 可以无限的取 print(g.name) # 可以无限的取 给页面传值 return redirect('/index') @app.route('/index') def login(): # print(g.name) # 只能在当前页面请求  return 'okoko' if __name__ == '__main__': app.run()

  信号

  系统send方法

# 信号

from flask import Flask, signals, render_template

app = Flask(__name__)
"""
    1.往信号中注册我们的函数
    2.不需要管调用,因为flask, 已经给我们设置调用点
    >>>其实就我们先设置信号 在到达某个点触发信号 >>> 执行我们设置的功能函数
    >>> 要用信号必须下载安装 pip install  blinker
    
"""


def f1(*args, **kwargs):
    print('触发信号', args, kwargs)


signals.request_started.connect(f1)  # 注册函数 >>> 触发信号的调用

# signals.request_started.send
# 触发信号: signals.request_started.send()
@app.before_first_request  # 第一次请求
def f2(*args, **kwargs):
    print('before_first_request')

@app.before_request
def f4():
    print('before_request')

@app.route('/', methods=['GET', 'POST'])
def f3(*args, **kwargs):
    print('视图')
    return '视图'


if __name__ == '__main__':
    app.run()

  自定义 信号的实现

from flask import Flask, current_app, flash, render_template
from flask.signals import _signals

app = Flask(import_name=__name__)

# 自定义信号
xxxxx = _signals.signal('xxxxx')


def func(sender,a):
    print(sender,a)
    print("我是自定义信号")



# 自定义信号中注册函数
xxxxx.connect(func)


@app.route("/x")
def index():
    # 触发信号
    xxxxx.send("sb",a="1")
    return 'Index'


if __name__ == '__main__':
    app.run()

  g对象和session的区别

  15.flask_session

# flask_session

from flask import Flask, session
from flask_session import Session
import redis



"""
作用:将默认保存的签名cookie中的值 保存到 redis/memcached/file/Mongodb/SQLAlchemy

安装:pip3 install flask-session

使用1:
"""

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis' # 保存到redis
app.config['SESSION_REDIS'] = redis.Redis('127.0.0.1', port='6379')
app.config['SESSION_KEY-PREFIX'] = 'KOKO'
Session(app)  # 导入app

# 设置
@app.route('/')
def set_session():
    session['db'] = 'koko'
    return 'ok'

#
@app.route('/index')
def index():
    print(session['db'])
    return 'ok'


if __name__ == '__main__':
    app.run()

  16.数据库连接池

  1.项目的开发规范

   1.1 下载 

 
1.pip install flask-sqlalchemy
2.下载 下载 pip install pymysql

  1.2 数据库的 迁移命令

(1 ) 首先进行初始化
python manage.py  db1 init

(
2) 迁移model 表 是要注意 如果出现下面的情况别慌 D:day_92>python manage.py db1 migrate INFO [alembic.runtime.migration] Context impl MySQLImpl. INFO [alembic.runtime.migration] Will assume non-transactional DDL. ERROR [root] Error: Target database is not up to date. (3) 上面情况的解决:python manage.py db1 upgrate

注意:

  

   1.3  执行model  表的迁移

  python manage.py db1 migrate  执行model  表的迁移 

   2 . 软件开发目录规范

  2.1 settins.py

class BaseConfig(object):
    """
    1.pip install flask-sqlalchemy
    在 下载 pip install pymysql
    2. 链接数据库的配置
    # SESSION_TYPE = 'redis'  # session类型为redis
    # SESSION_KEY_PREFIX = 'session:'  # 保存到session中的值的前缀
    # SESSION_PERMANENT = True  # 如果设置为False,则关闭浏览器session就失效。
    # SESSION_USE_SIGNER = False  # 是否对发送到浏览器上 session:cookie值进行加密

    """

    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123@127.0.0.1:3306/flask92?charset=utf8"
    # 数据连接池
    SQLALCHEMY_POOL_SIZE = 5
    # 最大连接量
    SQLALCHEMY_POOL_TIMEOUT = 30
    # 回收线程数
    SQLALCHEMY_POOL_RECYCLE = -1

    # 追踪对象的修改并且发送信号
    SQLALCHEMY_TRACK_MODIFICATIONS = False


class ProductionConfig(BaseConfig):
    pass


class DevelopmentConfig(BaseConfig):
    pass


class TestingConfig(BaseConfig):
    pass

  2.2  项目更目录下的文件执行的配置 manage.py

class BaseConfig(object):
    """
    1.pip install flask-sqlalchemy
    在 下载 pip install pymysql
    2. 链接数据库的配置
    # SESSION_TYPE = 'redis'  # session类型为redis
    # SESSION_KEY_PREFIX = 'session:'  # 保存到session中的值的前缀
    # SESSION_PERMANENT = True  # 如果设置为False,则关闭浏览器session就失效。
    # SESSION_USE_SIGNER = False  # 是否对发送到浏览器上 session:cookie值进行加密

    """

    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123@127.0.0.1:3306/flask92?charset=utf8"
    # 数据连接池
    SQLALCHEMY_POOL_SIZE = 5
    # 最大连接量
    SQLALCHEMY_POOL_TIMEOUT = 30
    # 回收线程数
    SQLALCHEMY_POOL_RECYCLE = -1

    # 追踪对象的修改并且发送信号
    SQLALCHEMY_TRACK_MODIFICATIONS = False


class ProductionConfig(BaseConfig):
    pass


class DevelopmentConfig(BaseConfig):
    pass


class TestingConfig(BaseConfig):
    pass

  2.3 views 下面的的功能函数 account

  2.3 .1 account.py 

# 业务功能区
from flask import Blueprint  # 导入蓝图
from .. import db

# 将我们文件注册到蓝图中 避免文件的相互导入 redis 的导入
account = Blueprint('account', __name__)


@account.route('/login')
def login():
    # db.session.add(models.Users(username='lqz', email='123'))
    # db.session.query(models.Users).all()
    # db.session.commit()
    # 添加示例
    """
    db.session.add(models.Users(username='lqz', pwd='123', gender=1))
    db.session.commit()

    obj = db.session.query(models.Users).filter(models.Users.id == 1).first()
    print(obj)

    PS: db.session和db.create_session
    """

    # 添加实列
    # db.session.add(models.Users(username='wupeiqi1', email='wupeiqi1@xx.com'))
    # db.session.commit()
    # db.session.close()

    # 执行函数
    return 'login'

  2.3.2 __init__  包内模块的 app配文件

  

# 每个项目的app注册文件
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()  # 生成对象 键连接数据的对象
from .models import *
from .views import account


def create_app():
    app = Flask(__name__)
    app.config.from_object('settings.DevelopmentConfig')  # 文件的中设置debug = True
    # 将app 注册到app 中
    db.init_app(app)
    # 注册蓝图
    app.register_blueprint(account.account)
    return app

  2.3.3 model.py 文件代码

# 用户数据库模型表

from . import db
class Users(db.Model):
    '''
        用户表
    '''
    __tablename__ = 'users'
    # 用户id
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80),unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    # 字符串转发
    # def __str__(self): NO
    def __repr__(self):
        return '<User %r>' % se        

  17.wtforms

  forms 组件的检验 

  1.报错的解决方法

  

     解决方法

  18.多app应用

  19.flask_script

#第一步安装:pip3 install flask-script
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager=Manager(app)

@app.route("/")
def index():
    return "ok"

@manager.command
def custom1(arg,a):
    """
    自定义命令
    python manage.py custom 123
    :param arg:
    :return:
    """
    print(arg,a)


@manager.option('-n', '--name', dest='name')
@manager.option('-u', '--url', dest='url')
def cmd1(name, url):
    """
    自定义命令(-n也可以写成--name)
    执行: python .py  cmd -n lqz -u http://www.oldboyedu.com
    执行: python shell_flask_srcipt.py  cmd --name lqz --url http://www.oldboyedu.com
    :param name:
    :param url:
    :return:
    """
    print(name, url)

if __name__ == '__main__':
    manager.run()

  20.flask_admin

原文地址:https://www.cnblogs.com/mofujin/p/11839275.html