目录
一、django和flask的区别?(面试题)
- django是个大而全的框架,flask是个轻量级的框架。
- django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelsform / 视图 / 路由 / 模板 / 中间件 / 分页 / auth / content-type / 缓存 / 信号 / 多数据库连接 等。
- flask框架本身没有太多的功能:路由 / 视图 / 模板(jinja2) / session / 中间件 ,第三方组件非常齐全。
- django的请求处理是逐一封装传递的;flask的请求是利用上下文管理实现的。
二、flask的快速使用
1. 安装
pip install flask
1.1 依赖wsgi Werkzeug
安装flask,会安装依赖包Werkzeug。
flask基于werkzeug的wsgi实现,flask本身自己没有wsgi:
from werkzeug.serving import run_simple
def func(environ, start_response):
print('请求来了')
pass
if __name__ == '__main__':
run_simple('127.0.0.1', 5000, func)
进一步
from werkzeug.serving import run_simple
class Flask(object):
def __call__(self, environ, start_response):
return 'xx'
app = Flask()
if __name__ == '__main__':
run_simple('127.0.0.1', 5000, app)
"""
执行app,app()会调用__call__方法
"""
再进一步
from werkzeug.serving import run_simple
class Flask(object):
def __call__(self, environ, start_response):
return 'xx'
def run(self):
run_simple('127.0.0.1', 5000, self)
app = Flask()
if __name__ == '__main__':
app.run()
2. flask快速开发
# 导入flask
from flask import Flask
# 创建flask对象
app = Flask(__name__)
@app.route('/index/')
def index():
return 'hello world'
if __name__ == '__main__':
app.run()
总结:
- flask基于werkzeug的wsgi实现,flask本身自己没有wsgi;
- 用户请求一旦到来,就会执行
app.__call__
方法
3. 简单登录案例
from flask import Flask, render_template, jsonify, request, redirect, url_for
app = Flask(__name__)
@app.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
# return '登录' # HttpResponse
return render_template('login.html') # render
# return jsonify({'code': 1000, 'data': [1, 2, 3]}) # JsonResponse
username = request.form.get('username')
pwd = request.form.get('pwd')
if username == 'letme' and pwd == '123':
# return redirect('/index/')
return redirect(url_for('index')) # 反向解析
errormsg = '用户名或者密码错误!'
# return render_template('login.html', **{'errormsg': errormsg})
return render_template('login.html', errormsg=errormsg)
@app.route('/index/', endpoint='index') # endpoint:反向解析
def index():
return '首页'
if __name__ == '__main__':
app.run()
由上简单总结flask知识点
"""
1. flask路由
参数:
url
methods:允许访问的方法类型
endpoint:用于反向解析,不写默认就是函数名,不能重名
"""
@app.route('/index/', methods=['GET', 'POST'] endpoint='lg')
def login():
pass
"""
2.支持动态路由
"""
@app.route('/index/')
def index():
pass
@app.route('/index/<name>')
def index(name):
pass
@app.route('/index/<int:pk>')
def index(pk):
pass
"""
3. 视图:获取提交的数据
request.args : GET形式传递的参数
request.form : POST形式传递的参数
"""
@app.route('/login/', methods=['GET', 'POST'])
def login():
username = request.form.get('username')
pwd = request.form.get('pwd')
"""
4. 返回数据
"""
@app.route('/login/', methods=['GET', 'POST'])
def login():
return '登录' # HttpResponse
return render_template('login.html') # render
return jsonify({'code': 1000, 'data': [1, 2, 3]}) # JsonResponse
# return redirect('/index/')
return redirect(url_for('index')) # 反向解析
"""
5. 模板处理
{{ xxx }}
{% for item in list %}
{{ item }}
{% endfor %}
"""
三、蓝图
功能:构建业务功能可拆分的目录结构。
__init__
:
from flask import Flask
from .views.users import user
from .views.carts import cart
def create_app():
app = Flask(__name__)
app.secret_key = 'dsdhsjfhnksjfnxjk'
""" 将蓝图对象注册进来"""
# app.register_blueprint(user)
# app.register_blueprint(cart)
# url_prefix='/user/':访问蓝图中的路由要带user,http://127.0.0.1:5000/user/f1
app.register_blueprint(user, url_prefix='/user/')
app.register_blueprint(cart, url_prefix='/cart/')
return app
启动文件:manage.py
from pro_flask import create_app
app = create_app()
if __name__ == '__main__':
app.run()
面试题:django的app和flask的蓝图有什么区别?
相同点:①app和蓝图充当的功能是一样的,都是用于业务拆分 / ②都需要注册才能使用 / ③都可以在内部定义模板和静态文件。
不同点:①蓝图可大可小,小的可以只有视图函数,大的和app一样 / ②另外蓝图和app的注册方式不一样,app是在配置文件settings中注册,蓝图是通过app.register_blueprint()注册 / ③flask中before/after_request比django中间件粒度更细。