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()
创建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()
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()
这里是配合着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()
多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 """
最后完整版的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 ...
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()
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')
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
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']
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')
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')
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>
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>

浙公网安备 33010602011771号