- 常见web框架
django
flask
- 设计模式
MVC
MTV
- 模板
(1)jinjia2
A. URL反转
from flask import url_for
url_for('.other') # 生成绝对路径;'.' 从当前模块寻找
static/site.css
url_for('static', filename='stie.css')
B.设置变量
set links=[
('Home', url_for('.index')),
('About', url_for('.about'))]
C. if/for循环
for label, href in links
if loop.index is odd | endif
{{ label }}
endfor
D. 内置常量
loop.index: from1
loop.index0: from 0
loop.first
loop.last
loop.length
E. 模板测试
for label, href in links
if not loop.first | endif
if href is current_link
{{ label }}
else
{{ label }}
endif
endfor
from flask import request
@app.tempalte_test('current_link')
def current_link(link):
return link == request.path
(2)模板继承
extends 'base.html'
子父模板结合:
block title
block head
block content
子模版会覆盖掉父模板中同名的部分,如果子模版想保留父模板中的内容:
{{super()}} # 继承时保留自己的内容
base模板引入其它模板:
include ‘includes/_header.html’ # include 文件拆分,提取重复部分
(3)过滤器
‘hello’|capitalize
[1,2,3]|sort
-10|abs
ref: docs.jinkan.org/docs/jinjia2/templates.html#builtin-filter
(4)jinjia宏
前台登录跳转macro:
from flask import redirect
app = Flask(name)
def index():
return redirect('login')
从模块导入宏:
import 'form.html' as form
定义宏:
macro imput(name,...)
- endmacro
ref: docs.jinkan.org/docs/jinjia2/templates.html
- 路由
(1)变量规则
(2)蓝图:url 功能扩展
news.py =>
from flask import Blueprint
news_list = Blueprint('news', name)
@news_list.route('/news')
def do_news():
return '滚动新闻'
app.py =>
import admin, news
app.register_blueprint(news.news_list) # 前台
app.register_blueprint(admin.admin_list, url_prefix='admin') # 后台
(3)模块和包
调试入口:
manage.py =>
from app import app
app.run()
MTV:
models.py
templates: admin/home
home/view
admin/view
导入模块的路径处理:
当前脚本所在路径
data_path = os.path.join(os.path.dirname(os.path.abspath(file))
当前目录加入到系统目录
sys.path.append(os.path.dirname(os.path.abspath(file))
从包里导入模块:
from testpackage import mod1
从当前目录导入
from . import mod2
从mod2导入func2函数
from .mod2 import func2
- bootstrap 前端开源框架
pip3 install flask_bootstrap
三方路径:lib>python3.7>site-packages>flask_bootstrap
运行至少包括:
bootstrap.min.css
jquery.min.js
bootstrap.min.js
manage.py =>
from flask_bootstrap import Bootstrap
Bootstrap(app) # 绑定
home.html =>
extends ‘bootstrap/base.html’ # 继承base.html
使用方法:
(1)download template: starbootstrap-admin2
与 flask 结合:sbadmin.py
将 templates 和 static 放在:
douban>app>templates>home
douban>app>static
展示修改:app>home>views.py
栅格: https://v3.bootcss.com/examples/grid/
(2)BootstrapCDN
bootstrapcdn.com/bootswatch
bootswatch.com/darkly
mysql> /usr/local/mysql/bin/mysql -u root -p
mysql> use db1
mysql> show tables ;
mysql> select * from t1 limit 10
mysql> desc t1 ;
app>home>views.py
from app.models import *
T1.query.all()[0:10]
SQL Alchemy => https://www.osgeo.cn/sqlalchemy/index.html
app>models.py
from sqlalchemy import Column, Integer, String, Float
from flask_sqlalchemy import SQLAlchemy
class T1(db.Model): # 继承自父类 app>init.py
tablename= 't1'
init.py
app.config.from_object(Config)
db = SQLAlchemy()
db.init_app(app) # 绑定db
通过 config.py 构建db与pymysql的连接:
class Config(object):
# MySQL Config 名称全部大写
pymysql: connect/select/close
尽量使用封装pymysql的ORM方式
总结sql/orm/oracle 查询对应关系表
-
展示情感分析结果
阅读顺序:manager.py => app>init.py => home>views.py
数据填充:
A. 通过 render_template(‘/home/result.html’, shorts=shorts)
B. 通过 ajax 调用 jquery
数据模型:
列和数据类型: => osgen.cn/sqlalchemy/core/type_basics.html#sql-standard-and-multiple-vendor-types
定义约束条件和索引:主键、外键
-
登录界面
(1)表单
A. flask-wtf
mysql>select * from users \G
mysql>desc users ;
=> manage.py
from flask_script import Manager
manager = Manager(app) # 实例化
from livereload import Server # 实时刷新网页
python manage.run dev
- dev # 自动刷新
- shell flask # 交互命令
- runserver # app.run
templates>home>login.html: line10-24
app>home>forms.py: class LoginForm()
validators: 校验函数
Length: 输入长度
Anyof('a', ;'): 输入校验
相关:views.py forms.py login.html
防止跨站请求伪造攻击(CSRF):校验
=> config.py
SECRET_KEY = ‘KEY’ # 密钥足够长
B. cookie
from flask import request, Response
setcookie() > resp.set_cookie()
getcookie() > request.cookies.get()
delcookie() > resp.delete_cookie()
C. session
基于cookie实现将cookie放在服务器上
setsession()
getsession()
delsession()
PERMANENT_SESSION_LIFETIME
D. flask-login
=> manage.py
from flask_login import LoginManager, login_user, login_required
login_manager = LoginManager()
app = Flask(name)
页面保护:
@login_required
def result():
增加用户:
from models import User
user = User(
username = ‘user2’,
password = ‘user2’,
)
from manage import db
db.session.add(user)
db.session.commit()
export FLASK_APP=manage.py
flask shell
python manage.py shell
循环引用:from models import * 位置
(2)数据库
flask-sqlalchemy
flask-sqlacodegen: 通过创建mysql的表反向生成ORM models
pip install flask_sqlalchemy
depend on sqlalchemy, flask_sqlalchemy, pymysql
rm db.py users.py
bash modelgen.sh
vim db.py
vim users.py
-
部署
(1)基于wSGI的 gunicorn
(2)wSGI
wsgi.py
requirements.txt
venv
激活虚拟环境:
source venv/bin/activate
安装需要的包:
pip install -r requirements.txt
cat requirements.txt
gunicorn==20.0.4
支持多进程:通过nginx => http/https => gunicorn => uWSGI => 连接flask
nginx 解决用户连接过慢、IP/URL请求过滤(WAF)
gunicorn -w 2 -b 127.0.0.1:9001 wsgi:app
-
MYSQL 常见操作
alter table news modify column title varchar(130);
-
Python 快捷键
Mac command + /
Windows\Linux Ctrl + /
django
flask
MVC
MTV
(1)jinjia2
A. URL反转
from flask import url_for
url_for('.other') # 生成绝对路径;'.' 从当前模块寻找
static/site.css
url_for('static', filename='stie.css')
B.设置变量
set links=[
('Home', url_for('.index')),
('About', url_for('.about'))]
C. if/for循环
for label, href in links
if loop.index is odd | endif
{{ label }}
endfor
D. 内置常量
loop.index: from1
loop.index0: from 0
loop.first
loop.last
loop.length
E. 模板测试
for label, href in links
if not loop.first | endif
if href is current_link
{{ label }}
else
{{ label }}
endif
endfor
from flask import request
@app.tempalte_test('current_link')
def current_link(link):
return link == request.path
(2)模板继承
extends 'base.html'
子父模板结合:
block title
block head
block content
子模版会覆盖掉父模板中同名的部分,如果子模版想保留父模板中的内容:
{{super()}} # 继承时保留自己的内容
base模板引入其它模板:
include ‘includes/_header.html’ # include 文件拆分,提取重复部分
(3)过滤器
‘hello’|capitalize
[1,2,3]|sort
-10|abs
ref: docs.jinkan.org/docs/jinjia2/templates.html#builtin-filter
(4)jinjia宏
前台登录跳转macro:
from flask import redirect
app = Flask(name)
def index():
return redirect('login')
从模块导入宏:
import 'form.html' as form
定义宏:
macro imput(name,...)
ref: docs.jinkan.org/docs/jinjia2/templates.html
(1)变量规则
(2)蓝图:url 功能扩展
news.py =>
from flask import Blueprint
news_list = Blueprint('news', name)
@news_list.route('/news')
def do_news():
return '滚动新闻'
app.py =>
import admin, news
app.register_blueprint(news.news_list) # 前台
app.register_blueprint(admin.admin_list, url_prefix='admin') # 后台
(3)模块和包
调试入口:
manage.py =>
from app import app
app.run()
MTV:
models.py
templates: admin/home
home/view
admin/view
导入模块的路径处理:
当前脚本所在路径
data_path = os.path.join(os.path.dirname(os.path.abspath(file))
当前目录加入到系统目录
sys.path.append(os.path.dirname(os.path.abspath(file))
从包里导入模块:
from testpackage import mod1
从当前目录导入
from . import mod2
从mod2导入func2函数
from .mod2 import func2
pip3 install flask_bootstrap
三方路径:lib>python3.7>site-packages>flask_bootstrap
运行至少包括:
bootstrap.min.css
jquery.min.js
bootstrap.min.js
manage.py =>
from flask_bootstrap import Bootstrap
Bootstrap(app) # 绑定
home.html =>
extends ‘bootstrap/base.html’ # 继承base.html
使用方法:
(1)download template: starbootstrap-admin2
与 flask 结合:sbadmin.py
将 templates 和 static 放在:
douban>app>templates>home
douban>app>static
展示修改:app>home>views.py
栅格: https://v3.bootcss.com/examples/grid/
(2)BootstrapCDN
bootstrapcdn.com/bootswatch
bootswatch.com/darkly
mysql> /usr/local/mysql/bin/mysql -u root -p
mysql> use db1
mysql> show tables ;
mysql> select * from t1 limit 10
mysql> desc t1 ;
app>home>views.py
from app.models import *
T1.query.all()[0:10]
SQL Alchemy => https://www.osgeo.cn/sqlalchemy/index.html
app>models.py
from sqlalchemy import Column, Integer, String, Float
from flask_sqlalchemy import SQLAlchemy
class T1(db.Model): # 继承自父类 app>init.py
tablename= 't1'
init.py
app.config.from_object(Config)
db = SQLAlchemy()
db.init_app(app) # 绑定db
通过 config.py 构建db与pymysql的连接:
class Config(object):
# MySQL Config 名称全部大写
pymysql: connect/select/close
尽量使用封装pymysql的ORM方式
总结sql/orm/oracle 查询对应关系表
展示情感分析结果
阅读顺序:manager.py => app>init.py => home>views.py
数据填充:
A. 通过 render_template(‘/home/result.html’, shorts=shorts)
B. 通过 ajax 调用 jquery
数据模型:
列和数据类型: => osgen.cn/sqlalchemy/core/type_basics.html#sql-standard-and-multiple-vendor-types
定义约束条件和索引:主键、外键
登录界面
(1)表单
A. flask-wtf
mysql>select * from users \G
mysql>desc users ;
=> manage.py
from flask_script import Manager
manager = Manager(app) # 实例化
from livereload import Server # 实时刷新网页
python manage.run dev
templates>home>login.html: line10-24
app>home>forms.py: class LoginForm()
validators: 校验函数
Length: 输入长度
Anyof('a', ;'): 输入校验
相关:views.py forms.py login.html
防止跨站请求伪造攻击(CSRF):校验
=> config.py
SECRET_KEY = ‘KEY’ # 密钥足够长
B. cookie
from flask import request, Response
setcookie() > resp.set_cookie()
getcookie() > request.cookies.get()
delcookie() > resp.delete_cookie()
C. session
基于cookie实现将cookie放在服务器上
setsession()
getsession()
delsession()
PERMANENT_SESSION_LIFETIME
D. flask-login
=> manage.py
from flask_login import LoginManager, login_user, login_required
login_manager = LoginManager()
app = Flask(name)
页面保护:
@login_required
def result():
增加用户:
from models import User
user = User(
username = ‘user2’,
password = ‘user2’,
)
from manage import db
db.session.add(user)
db.session.commit()
export FLASK_APP=manage.py
flask shell
python manage.py shell
循环引用:from models import * 位置
(2)数据库
flask-sqlalchemy
flask-sqlacodegen: 通过创建mysql的表反向生成ORM models
pip install flask_sqlalchemy
depend on sqlalchemy, flask_sqlalchemy, pymysql
rm db.py users.py
bash modelgen.sh
vim db.py
vim users.py
部署
(1)基于wSGI的 gunicorn
(2)wSGI
wsgi.py
requirements.txt
venv
激活虚拟环境:
source venv/bin/activate
安装需要的包:
pip install -r requirements.txt
cat requirements.txt
gunicorn==20.0.4
支持多进程:通过nginx => http/https => gunicorn => uWSGI => 连接flask
nginx 解决用户连接过慢、IP/URL请求过滤(WAF)
gunicorn -w 2 -b 127.0.0.1:9001 wsgi:app
MYSQL 常见操作
alter table news modify column title varchar(130);
Python 快捷键
Mac command + /
Windows\Linux Ctrl + /