flask的一些组件应用(signal,session的创建的两种方式,自定义组件实现登录权限验证)

点进来

信号的代码:

 

 1 from flask import Flask, signals, render_template, flash
 2 
 3 from flask.signals import _signals
 4 aps = Flask(__name__)
 5 aps.debug=True
 6 
 7 def ap1(*args, **kwargs):
 8     print('touch the signal:request_started')
 9 
10 
11 def ap2(*args, **kwargs):
12     print('touch the signals:appcontext_pushed')
13 
14 # aaa=_signals.signal('aaa')  # 这里是自定义的信号
15 # aaa.connect(ap1)
16 
17 
18 signals.request_started.connect(ap1)
19 signals.appcontext_pushed.connect(ap2)
20 
21 @aps.route('/hello')
22 def hello():
23     # aaa.send('abcdef',k1='vva')
24     return 'in me the tiger'
25 
26 
27 if __name__ == '__main__':
28     aps.run()
signals

 

 

创建session的方式:

 1 import models
 2 from threading import Thread
 3 from sqlalchemy.orm import sessionmaker
 4 from sqlalchemy import create_engine
 5 from sqlalchemy.orm import scoped_session
 6 eaengine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/demo?charset=utf8')
 7 aaa = sessionmaker(bind=eaengine)
 8 ses=scoped_session(aaa)  # 创建session的第二种方式,把我们的sessionmaker实例化出来的对象作为参数
 9 # 传入到scoped_session里面去然后用scoped_session实例化出来的对象去做操作
10 
11 def task():
12     ret=ses.query(models.Classes).all()
13     print(ret)
14     ses.remove()
15 
16 for i in range(3):
17     td=Thread(target=task)
18     td.start()
scoped_session

 

 1 import models
 2 from threading import Thread
 3 from sqlalchemy.orm import sessionmaker
 4 from sqlalchemy import create_engine
 5 
 6 eaengine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/demo?charset=utf8')
 7 aaa = sessionmaker(bind=eaengine)  # 用sessionmaker实例化出来一个对象aaa,
 8 
 9 
10 def hello():
11     from sqlalchemy.orm.session import Session
12     sess = aaa()  # 然后用sessionmaker实例化出来的这个对象aaa去再实例化出来一个sess,
13     # 用这个sess去对我们的数据进行操作,这是创建session的一种方式
14     data = sess.query(models.Classes).all()
15     print(data)
16     sess.close()
17 
18 
19 for i in range(3):
20     th = Thread(target=hello)
21     th.start()
sessionmaker

这里是配合着session用的model表

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 from sqlalchemy.ext.declarative import declarative_base
 4 from sqlalchemy import Column, Integer, String, UniqueConstraint, Index, DateTime, ForeignKey
 5 from sqlalchemy import create_engine
 6 from sqlalchemy.orm import relationship
 7 import datetime
 8 
 9 Base = declarative_base()
10 
11 
12 class Classes(Base):
13     __tablename__ = 'classes'
14     id = Column(Integer, primary_key=True, autoincrement=True)
15     name = Column(String(32), nullable=False, unique=True)
16 
17 
18 class Student(Base):
19     __tablename__ = 'student'
20     id = Column(Integer, primary_key=True, autoincrement=True)
21     username = Column(String(32), nullable=False, index=True)
22     password = Column(String(64), nullable=False)
23     ctime = Column(DateTime, default=datetime.datetime.now)
24     class_id = Column(Integer, ForeignKey("classes.id"))
25 
26     cls = relationship("Classes", backref='stus')
27 
28 
29 class Hobby(Base):
30     __tablename__ = 'hobby'
31     id = Column(Integer, primary_key=True)
32     caption = Column(String(50), default='篮球')
33 
34 
35 class Student2Hobby(Base):
36     __tablename__ = 'student2hobby'
37     id = Column(Integer, primary_key=True, autoincrement=True)
38     student_id = Column(Integer, ForeignKey('student.id'))
39     hobby_id = Column(Integer, ForeignKey('hobby.id'))
40 
41     __table_args__ = (
42         UniqueConstraint('student_id', 'hobby_id', name='uix_student_id_hobby_id'),
43         # Index('ix_id_name', 'name', 'extra'),
44     )
45 
46 
47 def init_db():
48     # 数据库连接相关
49     engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/demo?charset=utf8")
50     # 创建表
51     Base.metadata.create_all(engine)
52 
53 
54 def drop_db():
55     engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/demo?charset=utf8")
56     # 删除表
57     Base.metadata.drop_all(engine)
58 
59 
60 if __name__ == '__main__':
61     # drop_db()
62     init_db()
model

 

多App应用

 1 # 这里是多App应用在一个文件夹的代码
 2 from flask import Flask
 3 from werkzeug.wsgi import DispatcherMiddleware
 4 from werkzeug.serving import run_simple
 5 
 6 apa = Flask('api')
 7 apz = Flask('azi')
 8 
 9 
10 @apa.route('/xxx')
11 def xxx():
12     return 'in me the '
13 
14 
15 @apz.route('/zzz')
16 def zzz():
17     return 'tiger'
18 
19 # 我们的多App运行在一个文件里面这个DispatcherMiddleware类是关键,它内部的逻辑代码实现了这个功能,
20 dm = DispatcherMiddleware(apa, {
21     '/azi': apz,  # 这里的路由就是我们的zai前缀,它是我们上面的flask里面的字符串,
22     # 然后apz就是我们的视图里面对应的路由
23 })
24 
25 if __name__ == '__main__':
26     run_simple('localhost', 5000, dm)
27 
28 """
29 这里就是我们的DispatcherMiddleware的源码
30 class DispatcherMiddleware(object):
31 
32     def __init__(self, app, mounts=None):
33         self.app = app  # app就是我们上面的apa
34         
35         self.mounts = mounts or {}  # {'azi':apz}
36 
37     def __call__(self, environ, start_response):
38         script = environ.get('PATH_INFO', '')  # /azi/zzz 前面path_info是前缀路由,后面的''空字符串是我们的route里面设定的路由
39         path_info = ''
40         while '/' in script:
41             if script in self.mounts:
42                 app = self.mounts[script]
43                 break
44             script, last_item = script.rsplit('/', 1)  # script=azi,last_item=zzz
45             path_info = '/%s%s' % (last_item, path_info)
46         else:
47             app = self.mounts.get(script, self.app)
48         original_script_name = environ.get('SCRIPT_NAME', '')
49         environ['SCRIPT_NAME'] = original_script_name + script
50         environ['PATH_INFO'] = path_info
51         return app(environ, start_response)
52 """
manay_app_apply

 

最后完整版的flask自定义组件登录权限验证代码:

 

settings

 1 class Base():
 2     SQLALCHEMY_POOL_SIZE = 3
 3     SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123@127.0.0.1:3306/demo?charset=utf8'
 4     SQLALCHEMY_POOL_TIMEOUT = 30
 5     SQLALCHEMY_RECYCLE = -1
 6 
 7     # 追踪对象的修改并发送信号
 8     SQLALCHEMY_TRACK_MODIFICATIONS = False
 9     SECRET_KEY='sghsdjgksdlf'
10 
11 class DevelopmentConfig(Base):
12     DEBUG=True
13     ...
14 
15 
16 class TestingConfig(Base):
17     ...
18 
19 
20 class ProductionConfig(Base):
21     ...
settings

 

manage

 1 from end_copy_sqlalchemy import db, create_app
 2 from flask_script import Manager
 3 from flask_migrate import Migrate, MigrateCommand
 4 
 5 app = create_app()
 6 manage = Manager(app)
 7 """
 8 我们在下面使用了flask-migrate组件,就不需要再用我们的离线脚本了,
 9 它就相当于我们django里面的那个makemigration和migrate两个命令,
10 对于数据库进行监测更新的,
11 数据库迁移命名
12 python manage.py db init
13 python manage.py db migrate # makemigrations
14 python manage.py db upgrade # migrate
15 """
16 Migrate(app, db)
17 manage.add_command('db', MigrateCommand)
18 
19 
20 @manage.command  # 这里是自定制命令我们的程序启动的时候就用这个
21 def wahaha(obj):
22     print(obj)
23 
24 
25 if __name__ == '__main__':
26     manage.run()
manage

 

model表

 1 from sqlalchemy.ext.declarative import declarative_base
 2 from sqlalchemy import Column, Integer, String
 3 from end_copy_sqlalchemy import db
 4 
 5 
 6 class User(db.Model):
 7     __tablename__ = 'person'
 8     id = Column(Integer, primary_key=True, autoincrement=True)
 9     name = Column(String(32), nullable=True)
10     email=Column(String(32),default='alex@qq.com')
model

 

init

 1 from flask_sqlalchemy import SQLAlchemy
 2 from flask import Flask
 3 from flask_sqlalchemy import SQLAlchemy
 4 from .service.auth import Auth
 5 
 6 db = SQLAlchemy()
 7 from .views.accou import acp
 8 from .views.index import ind
 9 
10 
11 def create_app():
12     apo = Flask(__name__)
13     apo.config.from_object("settings.DevelopmentConfig")
14     apo.register_blueprint(acp)
15     apo.register_blueprint(ind)
16     db.init_app(apo)
17     Auth(apo)
18     return apo
__init__

 

auth认证权限

 1 from flask import request, session, redirect
 2 from flask_session import Session
 3 
 4 
 5 class Auth():
 6     def __init__(self, apa=None):
 7         self.app = apa
 8         if apa:
 9             self.init_app(apa)
10 
11     def init_app(self, apx):
12         apx.auth_manager = self
13         self.app = apx
14         apx.before_request(self.check_login)
15         apx.context_processor(self.context_processor)
16 
17     def check_login(self):
18         """
19         检查用户是否已经登录
20         :return:
21         """
22         if request.path == '/login':
23             return
24         user = session.get('user')
25         if not user:
26             return redirect('/login')
27 
28     def context_processor(self):
29         user = session.get('user')
30         return dict(current_user=user)
31 
32     def login(self, obj):
33         """
34         将用户信息放入到session里面
35         :param obj:
36         :return:
37         """
38         session['user'] = obj
39 
40     def logout(self):
41         """
42         从session中删除用户信息
43         :return:
44         """
45         del session['user']
auth

 

views

 1 from flask import blueprints, request, render_template, current_app, redirect
 2 from end_copy_sqlalchemy import db, model
 3 
 4 acp = blueprints.Blueprint('acp', __name__)
 5 
 6 
 7 @acp.route('/login', methods=['GET', 'POST'])
 8 def login():
 9     if request.method == 'GET':
10         return render_template('login.html')
11     else:
12         user = request.form.get('user')
13         email = request.form.get('email')
14         obj = db.session.query(model.User).filter(model.User.name == user,model.User.email==email).first()
15         db.session.remove()
16         if not obj:
17             return render_template('login.html', msg='you have got wrong username')
18         current_app.auth_manager.login(user)
19         return redirect('/index')
20 
21 
22 @acp.route('/logout')
23 def logout():
24     current_app.auth_manager.logout()
25     return redirect('/login')
view1
1 from flask import blueprints,render_template,redirect
2 from end_copy_sqlalchemy import model,db
3 ind=blueprints.Blueprint('index',__name__)
4 @ind.route('/index')
5 def index():
6     return render_template('index.html')
view2

 

templates

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width, initial-scale=1">
 7     <title>Title</title>
 8 </head>
 9 <body>
10 <form method="post">
11     <input type="text" name="user" placeholder="user">
12     <input type="email" name="email" placeholder="email">
13     <input type="submit" value="put on">
14     {{msg}}
15 </form>
16 </body>
17 </html>
login

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width, initial-scale=1">
 7     <title>Title</title>
 8 </head>
 9 <body>
10 <h1>欢迎登陆{{current_user}}</h1>
11 </body>
12 </html>
index

 

posted @ 2018-05-09 21:14  dream-子皿  阅读(121)  评论(0)    收藏  举报