知识点总结
回顾:
1.谈谈你对django和flask的认识。
django是一个比较大的重量级web框架,组件齐全适合大项目的开发,组件例如有缓存,orm,admin,form,分页等
flask是一个比较轻量级的web框架,特点,短小精悍,可扩展性强,适合开发小项目,flask学习成本高,光组件就得搞一天
2.flask和django最大的不同点:
django请求是将request作为参数,session是依附在request中,flask是导入request,session需要导入
4. 路飞总共有几个项目
- 管理后台
- 导师后台
- 主站
5. 路飞主站业务
- 课程
- 课程列表
- 课程详细
- 大纲、导师、推荐课程
- 价格策略
- 章节和课时
- 常见问题
- 深科技
- 文章列表
- 文章详细
- 收藏
- 评论
- 点赞
- 支付
- 购物车(4)
- 结算中心(3)
- 立即支付(1)
知识点:
- redis(为什么用redis?频繁的操作,频繁的状态,使用redis更适合)
- 支付宝
- 消息推送
- 构建数据结构
- 优惠券+贝里+支付宝
- 个人中心
- 课程中心
6. 播放视频:CC视频
- 加密
- 非加密
1.flask的配置文件实现:
app.config.from_objects('settings.DevelopmentConfig')
- 给你一个路径 “settings.Foo”,可以找到类并获取去其中的大写的静态字段。
1.settings.py
class Config(object):
DEBUG = False
TESTING = False
DATABASE_URL = ''
SECRET_KEY = 'asdfghj'
class ProductionConfig(Config):
DATABASE_URL = ''
class DevelopmentConfig(config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
2. xx.py
import importlib
path = "settings.Foo"
p,c = path.rsplit('.',maxsplit=1)
m = importlib.import_module(p)
cls = getattr(m,c)
# 如果找到这个类?
for key in dir(cls):
if key.isupper():
print(key,getattr(cls,key))
2.flask的路由系统
endpoint 反向生成路由,不写默认会是函数名
@app.route('/index/<int:nid>', endpoint='aaa')
def index(nid):
return '当前访问的url路径是:'+url_for('aaa', nid=nid)
url_for('endpoint') / url_for('index',nid=888)
动态路由:
@app.route('/index/<int:nid>',methods=['GET','POST'])
def index(nid):
print(nid)
return 'Index'
marksafe markup
有session需要在全局加SECRET_KEY = 'asdfghj'
3.请求相关的:
request.method
request.form
request.args
request.values
request.cookies
request.headers
request.path
request.full_path
request.script_root
request.url
request.base_url
request.url_root
request.host_url
request.files
obj = request.files['the_file_name']
obj.save('/var/www/uploads/'+secure_filename(f.filename))
4.响应:
响应体:
return '' return jsonify({'k1':'v1'}) return render_template('xxx.html') return redirect()
响应头:
obj = make_response('asdfg')
obj.headers['xxxxxxx'] = '123'
obj.set_cookie('key', 'value')
return obj
5.实现登录管理
版本一:
@app.route('/index')
def index():
if not session.get('user'):
return redirect(url_for('login'))
return render_template('index.html',stu_dic=STUDENT_DICT)
版本二:
import functools
def auth(func):
@functools.wraps(func)
def inner(*args,**kwargs):
if not session.get('user'):
return redirect(url_for('login'))
ret = func(*args,**kwargs)
return ret
return inner
@app.route('/index')
@auth
def index():
return render_template('index.html',stu_dic=STUDENT_DICT)
应用场景:比较少的函数中需要额外添加功能。
版本三:before_request
@app.before_request
def xxxxxx():
if request.path == '/login':
return None
if session.get('user'):
return None
return redirect('/login')
6.模板的渲染:
基本的数据类型:可以执行python语法,如:dict.get(),list[0]
传入函数:
django,加括号自动执行
flask,不能自动执行,需要调用
全局定义函数:
@app.template_global()
def sb(a1,a2):
# {{sb(1,9)}}
return a1 + a2
@app.template_filter()
def db(a1,a2,a3):
# {{1|db(2,3)}} ---必须以管道符分割
return a1 + a2 + a3
模板的继承:
模板: {% block content %} {% endblock %}
继承: {% extends 'layout.html' %} {% block content %} {% endblock %}
模板的引用include:
{% include 'form.html' %}
宏macro : {% macro ccc(name, type='text', value='') %}
<h1>hong</h1>
<input type='{{type}}' name='{{name}}' value='{{value}}'></input>
7
<input type='submit' value='提交'>
{{ccc('n1')}}
{{ccc('n2')}} {% endmacro %}
7.flask的session:
当请求到来时,flask读取cookie中的session对应的值,将该值解密并反序列化成字典,放入内存以便视图函数使用。
视图函数:
@app.route('/index')
def index():
session['k1'] = 123
session['k2'] = 456
del session['k1']
return 'session'
当请求结束时,flask会读取内存中字典的值,然后进行序列化+加密,写入到用户的cookie中。
8.闪现,在session中存储一个数据,读取时通过pop将数据移除,再次读取时为空。
from flask import Flask, flash, get_flashed_messages
@app.route('/page1')
def page1():
flash('临时数据的存储','error')
flash('asdfn',error)
flash('12346',info)
@app.route('/page2')
def page2():
print(get_flashed_messages(category_filter=['error']))
return 'session'
9.中间件:
call方法什么时候执行?
启动flask时不会执行call方法,当请求的时候才会执行
如何做到在执行call方法之前,做一个操作,call方法之后做一个操作?
class Middleware(object):
def __init__(self,old):
self.old = old
def __call__(self, *args, **kwargs):
print(2222222222222)
ret = self.old(*args, **kwargs)
print(3333333333333)
return ret
if __name__ == "__main__":
app.wsgi_app = Middleware(app.wsgi_app)
app.run()
10.特殊装饰器:类似于django的中间件
1.before_request:
2.after_request
from flask import Flask
app = Flask[__name__]
@app.before_request
def x1():
print('before:x1')
return 'xxxxx'
@app.before_request
def xx1():
print('before:xx1')
@app.after_request
def x1(response):
print('after:x1')
return response
@app.after_request
def xx2(response):
print('after:xx2')
return response
六个特殊的装饰器
before_request after_request template_global template_filter before_first_request errorhandler