【G20200389010208-Week 05】学习总结 · Issue #1183 · Python000-class01/Python000-class01 · GitHub
Skip to content

【G20200389010208-Week 05】学习总结 #1183

Description

@kavanchen
  1. 常见web框架
    django
    flask
  2. 设计模式
    MVC
    MTV
  3. 模板
    (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. 路由
    (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

  1. 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 查询对应关系表

  1. 展示情感分析结果
    阅读顺序: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
    定义约束条件和索引:主键、外键

  2. 登录界面
    (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. 部署
    (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

  2. MYSQL 常见操作
    alter table news modify column title varchar(130);

  3. Python 快捷键
    Mac command + /
    Windows\Linux Ctrl + /

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions