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