11 2019 档案
摘要:后台逻辑 模型 from exts import dbfrom datetime import datetimeclass BannerModel(db.Model): __tablename__ = 'banner' id = db.Column(db.Integer, primary_key=T
阅读全文
摘要:视图 @bp.route('/banners/')@login_required@permission_required(CMSPersmission.POSTER)def banners(): return render_template('cms/cms_banners.html') 给这个ur
阅读全文
摘要:把base模板分为左右两块版心 .main-container{ /*整体版心*/ width: 990px; margin: 0 auto; overflow: hidden;}.lg-container{ /*左侧版心*/ width: 730px; float: left;}.sm-conta
阅读全文
摘要:模板抽离 由于前后台的模板有些需要的元素如,js,css是相同的,这里抽离出来做base模板 {% from "common/_macros.html" import static %}<meta name="csrf-token" content="{{ csrf_token() }}"><scr
阅读全文
摘要:配置文件中加入前台用户的身份标识 form class SigninForm(BaseForm): telephone = StringField(validators=[Regexp(r'1[345789]\d{9}', message='手机号不合法')]) password = StringF
阅读全文
摘要:将登录和注册需要的共性标签抽离出来做父模板 将css改名为base base模板 {% from 'common/_macros.html' import static %}<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <t
阅读全文
摘要:实现功能,访问测试页面的时候,跳转到注册页面,注册成功后跳转到测试页面 使用参数:若是从其他地址跳转过来时,头部信息中会携带参数referrer,此参数为从从哪个地址跳转到当前地址的,若是直接从浏览器输入的地址,则不会携带此参数 准备一个测试页面和接口 <!DOCTYPE html><html la
阅读全文
摘要:给提交按钮加一个id,方便写js js //发送ajax请求注册请求$(function () { $('#submit-btn').click(function (event) { event.preventDefault(); var telephone_input = $('input[nam
阅读全文
摘要:将两个验证码的视图都放到common蓝图下 from flask import Blueprint, request, make_responsefrom exts import alidayufrom utils import restfulfrom utils.captcha import Ca
阅读全文
摘要:前面的方法存在安全隐患,只要知道发送短信验证码的接口就可以无限触发发送短信验证码 改用post请求,在前端加scrf_token验证,后面需要使用到md5加密,引入md5 from apps.forms import BaseFormfrom wtforms import StringFieldfr
阅读全文
摘要:from flask import Blueprint, requestfrom exts import alidayufrom utils import restfulfrom utils.captcha import Captchabp = Blueprint("common", __name_
阅读全文
摘要:阿里大于短信平台:https://dysms.console.aliyun.com/dysms.htm#/overview 使用教程:https://blog.csdn.net/qq1031893936/article/details/81173878 控制台-->短信服务 进去后开通服务,点击添加
阅读全文
摘要:把验证码渲染到到页面上 访问,显然,是标签有个内边距 去掉内边距 加一个class 如果放大看的话,还有问题 用js实现点击更换图形验证码:生成查询字符串的形式访问图形验证码接口的url,放到img标签中,img标签检测到url改变会自动请求改变的url 处理url的js var param = {
阅读全文
摘要:确认版本: oracle版本:64位 python版本:64位 下载cx_Oracle的whl包:64位 安装whl包:pip install wheel cd到下载路径安装cx_Oracle的whl包:pip install cx_Oracle-7.2.3-cp36-cp36m-win_amd64
阅读全文
摘要:安装Pillow库,用于生成图形验证码:pip install Pillow 字体文件来源 生成一个验证码图片 import randomimport stringfrom PIL import Image, ImageDraw, ImageFont# Image:一个画布# ImageDraw:一
阅读全文
摘要:html {% from 'common/_macros.html' import static %}<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>前台注册</title> <script src="http:
阅读全文
摘要:安装shortuuid用于前台用户的主键:pip install shortuuid 创建模型 from datetime import datetimeimport enumfrom werkzeug.security import generate_password_hash, check_pa
阅读全文
摘要:实现方式 使用装饰器的形式,将权限判断加在视图上 声明接口需要什么权限,用户访问接口的时候,判断用户是否有此权限 权限判断,接收权限 def permission_required(permission): def outter(func): @wraps(func) def inner(*args
阅读全文
摘要:增加所有剩余菜单的页面,并用视图渲染,方便后面调试权限控制 {% extends 'cms/cms_base.html' %}{% block title %}板块管理{% endblock %}{% block head %}{% endblock %}{% block page_title %}
阅读全文
摘要:给用户绑定为开发者 个人信息中渲染角色和权限 {% extends 'cms/cms_base.html' %}{% block title %} 个人信息{% endblock %}{% block page_title %} {{ self.title() }}{% endblock %}{%
阅读全文
摘要:在用户模型下定义属性和方法,用于判断用户的权限 @propertydef permissions(self): """ 返回用户拥有的所有权限 """ if not self.roles: # 判断用户是否绑定角色 return 0 all_permissions = 0 for role in s
阅读全文
摘要:模型与权限关系映射表 class CMSPersmission: """ 权限管理映射 """ # 255的二进制方式来表示 1111 1111 ALL_PERMISSION = 0b11111111 # 1. 访问者权限 VISITOR = 0b00000001 # 2. 管理帖子权限 POSTE
阅读全文
摘要:这里采用把验证码放到memcached中,所以封装一个memcached的操作 import memcachecache = memcache.Client(['127.0.0.1:11211'], debug=True)def set(key, value, timeout=60): return
阅读全文
摘要:安装:pip install flask-mail 官方文档:https://pythonhosted.org/Flask-Mail/ 邮箱配置 MAIL_SERVER = 'smtp.qq.com' # 邮箱服务器地址MAIL_PORT = 465 # 端口MAIL_USE_TLS = True
阅读全文
摘要:在base.css中加一个全局的css控制宽度 .form-container{ width: 300px;} 视图 class ResetEmailView(views.MethodView): decorators = [login_required] def get(self): return
阅读全文
摘要:在base模板中引用 在修改密码的js中使用 $(function () { $('#submit').click(function (evnet) { evnet.preventDefault(); //阻止默认的提交表单事件 var oldpwdElement = $("input[name='
阅读全文
摘要:实现效果 css body.stop-scrolling { height: 100%; overflow: hidden; }.sweet-overlay { background-color: black; /* IE8 */ -ms-filter: "progid:DXImageTransfo
阅读全文
摘要:鉴于flask-restful用起来太麻烦,这里自定义json统一返回格式和内容 from flask import jsonifyclass HttpCode: """ 定义一些约定好的业务处理状态 """ ok = 200 # 业务处理成功 unautherror = 401 # 没有授权 pa
阅读全文
摘要:定义一个基类form,用于获取错误信息 from wtforms import Formclass BaseForm(Form): def get_error(self): # a = {'aaa': [xxx], 'bbb': [www]} a.popitem()[1][0]=xxx messag
阅读全文
摘要:顺便实现ajax提交的时候默认提交csrf_token var http = { 'get':function (args) { args['method'] = 'get'; this.ajax(args); }, 'post':function (args) { args['method'] =
阅读全文
摘要:加上CSRF防御 修改密码页面 视图 class ResetPwd(views.MethodView): decorators = [login_required] # 校验登录状态 def get(self): return render_template('cms/cms_resetpwd.ht
阅读全文
摘要:模板抽取,将公共的页面抽出来作为模板 {% from 'common/_macros.html' import static %}<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title> {% block title %
阅读全文
摘要:用户名渲染,使用flask的g对象,在用户请求进来之后,触发视图函数之前,拿用户的信息,放到g对象里面 @bp.before_requestdef before_request(): """ 请求进入视图函数之前判断用户是否登录,若已登录,则将当前用户的信息添加到g对象里面 """ if confi
阅读全文
摘要:定义一个宏,用于渲染static文件的时候,只需要传文件名就可以,上下两个“-”是解决渲染的时候源代码换行的情况 {% macro static(filename) -%} {{ url_for('static', filename=filename) }}{%- endmacro %} {% fr
阅读全文
摘要:装饰器,验证当前session中是否存在定义的user_id,没有就重定向到登录页 from flask import session, redirect, url_forfrom functools import wrapsimport configdef login_required(func)
阅读全文
摘要:config form from wtforms import Form, StringField, IntegerFieldfrom wtforms.validators import Email, InputRequired, Lengthclass LoginForm(Form): email
阅读全文
摘要:html <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" cont
阅读全文
摘要:数据库信息 DEBUG = TrueSQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'SQLALCHEMY_TRACK_MODIFICATIONS = False from flask_sqlalch
阅读全文
摘要:目录结构 cms模块 from flask import Blueprintbp = Blueprint('cms', __name__, url_prefix='/cms')@bp.route('/')def index(): return 'cms index' from .views impo
阅读全文
摘要:安装:pip install redis 连接 字符串操作 插入值 获取 删除值 列表操作,更多操作见源码 添加 获取 集合操作,更多操作见源码 哈希操作,更多操作见源码 事务操作:cache.pipeline(),更多操作见源码 发布与订阅:如用redis异步发邮件 监听 发布 再看监听 过滤数据
阅读全文
摘要:详见:http://redisdoc.com/persistence/index.html redis.conf RDB机制 改为5秒内1次 文件已生成 关闭RDB,注释掉3个save,重启redis即可生效 再插入数据,已无备份 AOF机制: appendonly yes:开启AOF机制 同步机制
阅读全文
摘要:redis事物可以一次执行多个命令,事物具有以下特征1、隔离操作:事物中的所有命令都会序列化、按顺序执行,不会被其他命令打扰2、原子操作:事物中的命令要么全部被执行,要么全部都不执行 开启一个事物,以后执行的所有命令都在这个事物中执行:multi 执行事物,将会在multi和exec中的操作一并提交
阅读全文
摘要:set集合操作 添加元素:sadd set value1 value2... 查看元素:smembers set 移除元素:srem set member 查看集合中的元素个数:scard set 获取多个几个的交集:sinter set1 set2 获取多个集合的并集:sunion set1 se
阅读全文
摘要:字符串操作 设置值 set key value 设置有空格的值,加引号 set username 'hello world' 获取值 get key 删除值:del key 清除所有内容:flushall 过期时间 添加的时候没有设置过期时间,则是永久有效set key value EX timeo
阅读全文
摘要:使用场景1、登录会话存储,存储在redis中,与mamcached相比,数据不会丢失2、排行榜、计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排行榜,还有一些文章阅读量、或者点赞数等3、作为消息队列,比如celery就是使用redis作为中间件4、当前在线人数5、一些常用的数据缓存,比如论
阅读全文
摘要:安装:pip install python-memcached 创建链接:mc = memcache.Client(['127.0.0.1:11211'], debug=True) 插入数据:mc.set('username', 'aaaa', time=120) 插入字典 获取数据 删除数据 自增
阅读全文
摘要:先打开telnet服务否则会报错 确认memcached服务已启动 telnet ip 端口 连上以后敲一下回车 常用的命令: 1、set:在memcached中添加一个key->value,如果这个key已经存在,则会替换原来的值,否则做添加操作set [key] 0[是否需要压缩] 60[过期时
阅读全文
摘要:Memcached是一个高并发的内存键值对缓存系统,它的主要作用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度。 官网:http://memcached.org/ 由于官网只提供linux版本的下载,所以window的版本需要另外收集 http
阅读全文
摘要:1、flask-Restful与蓝图结合使用如果要在蓝图中使用flask-Restful,那么在创建Api对象的时候,就不应该使用app,而是蓝图,如果有多个蓝图,则需在每一个蓝图里面创建一个Api对象 from flask import Blueprintfrom flask_restful im
阅读全文
摘要:接上一篇的代码和数据 对于复杂结构的数据如果只是定义单一结构的话返回的数据就没意义了,此时定义的数据结构需精确到所有数据的每一个字段有时候要返回的数据结构中,会有比较复杂的数据结构,证实后可以使用一些特殊字段来实现,如果某个字段的值是list,则使用fields.List、如果某个字段的值是字典,则
阅读全文
摘要:对于一个视图函数,可以指定好数据结构和字段用于返回,以后使用ORM模型或者自定义的模型的时候,它会自动获取模型中相应的字段,生成json数据,然后再返回给前端,这需要导入flask_restful.marshal_with装饰器,并且需要写一个字典,来指示要返回的字段名,以及该字段的数据类型 一、简
阅读全文
摘要:flask_restful插件提供了reqparse来做类似WTForms的验证功能来校验数据,add_argument可以指定这个字段的名字、数据类型等1.default:默认值,若没有传入此次参数,则使用此默认值2.required:控制此字段是否必传,默认为False,如果设为True,则开启
阅读全文
摘要:安装:flask 0.8以上、python2.6或者3.3以上:pip install flask-restful 使用方法:1.从flask_restful中导入Api,来创建对象 2.写一个视图函数,继承flask_restful.Resource,然后再这个里面使用想要的请求方式来定义相应方法
阅读全文
摘要:restful api是用于在前端与后台进行通信的一套规范,使用这个规范可以让前后端开发变得更加轻松 协议:http或者https 数据传输格式:使用json url链接:url链接中不能有动词(/get_list/),只能有名词(/list/),对于一些有复数的名词,则应该在后面加s(/lists
阅读全文
摘要:flask所有的内置信号 1.template_rendered:模板渲染完成后的信号2.before_render_template:模板渲染之前的信号3.request_started:模板开始渲染4.request_finished:模板渲染完成5.request_tearing_down:r
阅读全文
摘要:若安装flask是未默认安装blinker,则pip install blinker 使用信号分为3步,第一是定义一个信号,第二是监听一个信号,第三是发送一个信号 1.定义信号:定义信号需要使用到blinker.Namespace来创建一个命名空间 from blinker import Names
阅读全文
摘要:errorhandler:在发生一些异常的时候,如404、500,如果要自定义处理这些错误,就可以使用errorhandler来处理,使用errorhandler需要注意几点: 1.在errorhandler装饰的钩子函数下,要返回相应的状态码 2.在errorhandler装饰的钩子函数中,必须写
阅读全文
摘要:context_processor:使用这个钩子函数,必须返回一个字典,这个字典的值在所有模板中都可以使用,这个钩子函数作用是,如果一些在很多模板中都要用到的变量,那么就可以使用此钩子函数来返回,而不用在每个视图函数中的render_template()中去写,这样代码更加简洁和好维护,此函数必须返
阅读全文
摘要:在flask中钩子函数是使用特定的装饰器装饰的函数,用于在正常执行的代码中,插入一段自己想要执行的代码(hook) before_first_request:flask项目第一次部署后指向的钩子函数,类似于unittest的setupClass before_request:请求到达flask,但是
阅读全文
摘要:保存全局对象的g对象g对象是在整个flask应用运行期间都是可以使用的,并且也是和request一样,是线程隔离的,这个对象是专门用来存放开发者自己定义的一些数据,方便在整个flask程序中都可以使用,一般使用就是将一些经常会用到的数据绑定到上面,以后就直接从g上面取就可以了,而不需要通过传参的方式
阅读全文
摘要:app上下文: 先看现象 current_app源码 手动入栈 app_context()源码 with语句入栈 request上下文 不在app上下文中 即使手动入栈也会报错,不在请求上下文中 url_for()源码 手动推入请求上下文 应用上下文和请求上下文都是存放到一个LocalStack的栈
阅读全文
摘要:Local对象在flask中,类似于request对象,其实是绑定到了werkzeug.local.Local对象上,这样即使是同一个对象,在多线程中都是隔离的,类似的对象还有session以及g对象 Thread Local对象只要满足绑定到这个对象上的的属性,在每个线程中都是隔离的,那么此对象就
阅读全文
摘要:app里面还是要绑定CSRFProtect from flask_wtf import CSRFProtect # flask_wtf 已经提供CSRF的防御手段CSRFProtect(app) # 绑定app 登录页的js $(function () { $('#submit').click(fu
阅读全文
摘要:防御原理,将csrf_token放到session中,再将session放到cookie中 实现: from flask_wtf import CSRFProtect # flask_wtf 已经提供CSRF的防御手段CSRFProtect(app) # 绑定app CSRFProtect源码 需在
阅读全文
摘要:准备一个页面或图片,用于用户访问 一:表单方式 视图 from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def index(): return render_template('index.html
阅读全文
摘要:登录功能 在forms里面添加验证 class LoginForm(Form): email = StringField(validators=[Email(message='邮箱格式错误')]) password = StringField(validators=[Length(3, 20, me
阅读全文
摘要:CSRF攻击原理: 配置信息 import osSQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'SQLALCHEMY_TRACK_MODIFICATIONS = FalseSECRET_KEY =
阅读全文
摘要:1、设置session:使用flask.session就可以操作字典,操作方式和操作字典一样:session['key']=value2、获取session,和获取字典的值一样:session['key']、session.get('key')3、删除session中的值:和删除字典的值一样 ses
阅读全文
摘要:设置cookie有效域名cookie默认只能在主域名下使用,如果要在子域名下使用,则应该给set_cookie设置属性domain='.主域名',此时,此cookie在此主域名下的所有子域名均有效 from flask import Blueprint, requestbp = Blueprint(
阅读全文
摘要:设置cookie有效期1、max_age:距离现在多少秒后过期,在IE8以下不支持2、expires:datatime类型,使用此参数,需参照格林尼治时间,即北京时间-8个小时3、如果max_age和expires都设置了,则以max_age为参准4、若没有设置过期时间,则默认为浏览会话结束,即关闭
阅读全文
摘要:1、设置cookie:在flask.Response对象上,使用set_cookie('cookie名', 'cookie值')设置cookie set_cookie源码 key:cookie名value:cookie值max_age:最长过期时间,秒(IE8以下不支持)expires:最长过期时间
阅读全文
摘要:1、安装:pip install flask-wtf2、定义表单验证的时候,对文件的字段,需使用:FileField3、验证器从flask_wtf.file中导入,FileRequired为验证文件必传,FileAllowed为验证文件后缀名4、在视图函数中,使用werkzeug.datastruc
阅读全文
摘要:实现上传文件 1、在form表单中,需指定enctype="multipart/form-data",且文件上传的input标签type="file"2、在后台获取上传的文件request.files.get('文件上传input标签的name属性值')3、保存文件之前,先使用werkzeug.ut
阅读全文
摘要:此功能看似强大,实则鸡肋 from wtforms import Form, StringField, BooleanField, SelectFieldfrom wtforms.validators import Length, ValidationErrorclass SettingForm(F
阅读全文
摘要:如果想要对表单中的某个字段进行自定义验证,则需要对这个字段进行单独的验证1、定义一个方法,命名规则为:validate_字段名(self, filed)2、在方法中,使用filed.data获取字段的值3、如果验证成功,则不需要做任何操作,如果验证失败,则需要抛出一个异常:wtforms.valid
阅读全文
摘要:Email:验证数据是否为邮箱EqualTo:验证此字段的数据是否和另一个字段的值相等,常用与校验密码和确认密码InputRequired:检验数据必传Length:校验数据长度NumberRange:检验数据需在指定数字的区间Regexp:自定义正则表达式(如手机号码)URL:必须是url的形式U
阅读全文
摘要:作用:1、做表单验证,把用户提交的数据验证是否合法2、做模板渲染 安装:pip install wtforms 表单验证1、自定义一个表单类,继承wtforms.Form2、定义好需要验证的字段,字段名必须和表单中需要验证的字段的name属性值保持一致3、在需要验证的字段上,指定需要验证的数据类型4
阅读全文
摘要:在实际开发中,经常会发生数据库修改行为,一般数据库修改不是直接手动修改,而是去修改ORM模型,然后再把模型映射到数据库中,这些操作可以通过flask-migrate实现,flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实是Alembic做的,他能
阅读全文
摘要:使用flask-script可以实现自定义命令来操作flask,如:可以通过命令来跑一个开发版本的服务器、设置数据库、定时任务等安装:pip install flask-script 命令的添加方式1:@manager.command:用来传递不需要传递参数的命令2:@manager.option:
阅读全文
摘要:准备工作 配置数据 创建迁移文件并映射到数据库 增加字段 删除字段
阅读全文
摘要:常用命令:1、init:创建一个alembic仓库2、reversion:创建一个新的版本3、--autogenerate:自动将当前模型的修改,生成迁移脚本4、-m:message,可以记录本次迁移做了哪些修改,5、upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的upgrad
阅读全文
摘要:在一般情况下,如果修改了模型,如增加或者删除了字段,SQLAlchemy是不会更新的,这就需要使用alembic来实现 使用alembic步骤:一:定义好模型二:使用alembic创建一个仓库:alembic init 仓库名三:修改配置文件 1、在alembic.ini中,给SQLAlchemy.
阅读全文
摘要:一:连接数据库1、安装:pip install flask-sqlalchemy2、将数据库信息更新到app.config['SQLALCHEMY_DATABASE_URI']3、使用flask_sqlalchemy.SQLAlchemy这个类定义一个对象,并将app传进去:db = SQLAlch
阅读全文
摘要:子查询让多个查询变成一个查询,只需要查找一次数据库,性能相对来讲更高效,不用写多个SQL语句就可以实现一些复杂的查询,在SQLAlchemy中要实现一个子查询,应该使用以下步骤:1、将子查询按照传统方式写好查询代码,然后在query对象后面执行subquery(),将这个查询变成子查询2、在子查询中
阅读全文
摘要:准备工作 from datetime import datetimefrom sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKeyfrom sqlalchemy.ext.declarative i
阅读全文
摘要:group_by:根据某个字段进行分组,比如想要根据年龄进行分组,再统计每一组有多少人having:对查找结果进一步过滤,类似于SQL语句的where 准备工作 from sqlalchemy import create_engine, Column, Integer, String, Float,
阅读全文
摘要:懒加载在一对多,或者多对多的时候,如果要获取多的这一部分的数据的时候,通过一个relationship定义好对应关系就可以全部获取,此时获取到的数据是list,但是有时候不想获取全部数据,如果要进行数据筛选就需要遍历筛选,就比较麻烦,可以从查询返回值里面入手,比如在获取到的数据里面还要加个过滤条件,
阅读全文
摘要:一:limit:限制每次查询的时候查询数据的条数二:slice:查一个区间的数据,slice(起,止)三:offset:限制查找数据的时候过滤掉前面多少条四:切片:对query对象切实获取想要的数据 准备工作 from datetime import datetimefrom sqlalchemy
阅读全文
摘要:SQLAlchemy实现排序有三种方式一:order_by:查询的时候使用此方式根据某个字段或模型下的属性进行排序二:模型定义的时候,指定排序方式三:一对多的时候,relationship的order_by参数 准备工作 from sqlalchemy import create_engine, C
阅读全文
摘要:在SQLAlchemy中,只要将一条数据添加到session中,其它和此条数据相关联的数据都会一起存到数据库中,这是因为在relationship中有一个关键字参数:cascade,默认选项为save-update 一:save-update:默认选项,在添加一条数据的时候,会把其他和次数据关联的数
阅读全文
摘要:准备工作 from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKeyfrom sqlalchemy.ext.declarative import declarative_basefrom
阅读全文
摘要:准备工作 from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKeyfrom sqlalchemy.ext.declarative import declarative_basefrom
阅读全文
摘要:relationship()的uselist参数默认为True,即一对多,如果要一对一,则需让uselist=False 准备工作 from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignK
阅读全文
摘要:准备工作 from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKeyfrom sqlalchemy.ext.declarative import declarative_basefrom
阅读全文
摘要:使用SQLAlchemy创建外建,只需要在子表的字段中指定此字段的外建是哪个表的哪个字段即可,字段类型需和父表下该字段的类型保持一致 使用ondelete指定约束, 外建约束有以下几种:1、RESTRICT:删除父表数据时,如果子表有数据在使用该字段的数据时,会阻止删除(默认为此约束)2、NO AC
阅读全文
摘要:准备数据 等于 不等于 like(区分大小写,模糊查询)、ilike(不区分大小写) in not in(~,取反) 字段为空 不为空 and or
阅读全文
摘要:准备工作 from sqlalchemy import create_engine, Column, Integer, String, Floatfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm im
阅读全文
摘要:SQLAlchemy属性常用数据类型 Column常用参数
阅读全文
摘要:连接数据库操作 sqlalchemy映射步骤: 1、创建ORM模型,这个模型必须继承sqlalchemy提供的基类2、在这个ORM模型中创建一些属性,与表中的字段一一映射,这些属性必须是sqlalchemy提供的类型3、将创建好的ORM模型,映射到数据库中 from sqlalchemy.ext.d
阅读全文
摘要:手写SQL复用性不高,SQL越复杂越容易出bug,而且容易引起SQL注入,所以现在Ibanez使用orm框架将数据库映射为数据模型,这是使用SQLAlchemy 准备工作,安装SQLAlchemy和PyMySQL:pip install sqlalchemy、pip install pymsql 创
阅读全文
摘要:首先明确一点:直接使用ip地址和localhost不能用子域名 主域名实现 首先做一项配置,将本地host映射一个域名 在app的config中指定 SERVER_NAME 选项为配置的域名:端口号 启动flask程序,访问 子域名实现 在蓝图中通过subdomain来指定子域名 在本地host文件
阅读全文
摘要:模板文件: 根目录下的templates-->蓝图定义时指定的位置-->(若有相同名字的文件,则加载根目录下的资源)1、在蓝图的情况下,寻找静态资源依旧是默认从主目录的templates2、如果在根目录下的static和templates中没有找到指定文件,则会从蓝图声明时指定的文件夹下去找3、若默
阅读全文
摘要:蓝图用于将项目模块化,分开管理 比如项目有4个模块:用户管理、书籍、电影、新闻,如果放在一起不好管理也不好维护,可以将每个模块单独抽离出来,再同一使用,flask.Blueprint可以实现功能 Blueprint源码 项目蓝图分类: 以user模块为例 使用蓝图可以在定义的时候使用 url_pre
阅读全文
摘要:对于url的保护,一般是通过装饰器实现,如:某个页面需要登录后才能访问 函数视图实现 类视图实现类视图中的装饰器,需要重写类视图的一个类属性:decorators,这个列属性是列表或者元祖都可以,需要用多个装饰器时,按执行顺序放进去就行,会按里面的装饰器顺序执行,View中源码如下 如:以上面那个案
阅读全文
摘要:调度方法的视图基于flask.view.MethodView实现,根据请求方法的不同,执行类视图下对应的方法,只要是请求方法都可以定义:get、post、put、delete··· 拿登录来说 也可以将渲染模板单独抽离出来
阅读全文
摘要:标准视图继承自flask.view.View as_view源码 1、标准视图继承自flask.view.View2、并且在子类中必须实现dispatch_request方法,以后请求过来后,都会执行这个方法,这个方法的返回值就相当于是之前的函数视图一样,也必须返回Response或者子类的对象,或
阅读全文
摘要:flask注册视图有两种方式 一:add_url_rule()add_url_rule源码:rule:接口地址view_func=视图函数endpoint=终结点,可以理解为给当前视图取的别名,最直观的就是在url_for()的时候会用到,如果指定了endpoint,则在url_for()的时候,不
阅读全文
摘要:模板继承可以把有共性的一些代码抽出来放到父模板中,其他需要次特性的文件继承模板即可 在jinja2中,使用extends来继承定义好的模板,使用{% block 位置名%} {% endblock %}来预留位置 自己需要定义一个父模板 其他html继承base模板即可拥有所有的模块 block继承
阅读全文
摘要:静态文件: flask默认指定的静态文件路径为根目录下的static,可以自定义路径,并指定,使用url_for('文件夹', filename='文件名')引用 加载css文件 加载js文件 其他文件加载方式一样,只不过需要根据具体文件类型使用不同的标签
阅读全文
摘要:set jinja2模板内部可以用set定义变量,只要定义了这个变量,在后面的代码中都可以使用此变量 with 如果想让定义的变量只在部分作用域内有效,则不嫩更实用set,需使用with定义,with中定于的变量,稚嫩你在with语句中使用,超出范围无效
阅读全文
摘要:用于将页面的某一块地方抽取出来,要嵌入内容的时候使用,继承的概念 把具体内容分别放到其他地方同一管理,要用的时候使用include继承 使用include的时候可以直接使用接收的数据
阅读全文
摘要:宏有点类似于函数,接收一些数据,进行处理,但是没有返回值,可以将一些常用的代码片段放到宏中,然后把不固定的值抽出来做变量 使用maacro来定义宏,使用宏的时候,参数可以设默认值 自定义一个input标签 真实工作情况下是把宏单独封装起来,要用的时候导入使用(起点路径为templates),导入的方
阅读全文
摘要:jinja2中的逻辑语句和python中的基本一致,执行逻辑的时候用{% 逻辑关键字 %}开始,{% end逻辑关键字 %}结束 if语句(判断关键字也是一样的,and、or、not···): for循环,与python的for语法一致,但不可以使用continue和break来控制循环的执行 列表
阅读全文
摘要:过滤器的本质就是函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器函数,然后将函数的返回值作为滤器的返回值 1、在python文件中写好过滤的函数和逻辑2、将将函数注册到模板过滤器中:@app.template_filter('过滤器名')3、在模板中调用过滤器:变量|
阅读全文
摘要:1、abs:返回一个数的绝对值(见上一篇)2、default:如果当前变量没有值或字段,则展示默认值(见上一篇) 3、转义过滤器:如果后端出过来的值含html标签,可以控制是否视为html标签执行或者当成字符串处理 escape或e:转义符:会将<、>等html标签符号转义成html中的可展示符号(
阅读全文
摘要:在模板里面有时候需要对传过来的数据进行一些处理,jinja2有一些内置的过滤器可以进行处理。类似于python内置函数,通过 “|” 进行使用,详见jinja2官方文档 使用方法:{{ 变量名|过滤器名 }} 如:内置过滤器abs:作用为返回一个数的绝对值 default过滤器:如果传过来的数据有此
阅读全文
摘要:在页面中,有点击跳转到另一个地址的时候,可以使用url_for来指定要跳转的视图函数:{{ url_for('view_function') }} 如果该视图需要接收参数
阅读全文
摘要:从后台传参到模板,模板再渲染到前端 传参的时候,可以在html后面加上关键字传参,在模板里面用{{ 参数 }}使用即可,可以传多个参数 也可以使用**传参,取值的时候就直接取内容
阅读全文
摘要:jinja2用于渲染模板 查找路径 1、默认从项目根目录下的templates下面找指定的html文件 也可以往下新建路径 2、指定自定义路径 在Flask的源码中,指定了默认路径为templates 所以可以使用template_folder参数指定自定义路径
阅读全文
摘要:1.如果返回的是个合法的响应对象,则直接返回 同时,也可以在response里面做一些操作,比如增加cookie 2.如果返回的是一个字符串,那么flask会重新创建一个werkzeug,wrappers,Response对象,Response将该字符串作为主体,状态码为200,MIME的类型为te
阅读全文