zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java学习过程中的总结的小知识点(长期更新)
    年月日与time的相互转换
    Androidstudio预览时出现错误java.lang.NoClassDefFoundError: com/android/util/PropertiesMap
    eclipse中配置struts2出现There is no Action mapped for namespace [/] and action name [Login] associated wi
    struts2出错java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    第一次部署Struts2时出现错误java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class
    由JDK1.8降为JDK1.6时配置环境变量不起作用
    Androidstudio报错UnsupportedClassVersionError
    AndroidStudio导入Library
    Ubuntu下su被拒绝
  • 原文地址:https://www.cnblogs.com/mofujin/p/11839275.html
Copyright © 2011-2022 走看看