flask框架视图基本结构:
1.接收来自浏览器的数据2.校验数据(判断数据是否存在,格式是否符合要求,所需数据是否齐全)3.业务处理,(存储数据,或删除数据,查询数据)4.返回数据(渲染模板,或返回json数据)
需要携带参数时:
大多用POST请求方式,后端request.json.get( ) 来获取参数.
GET请求方式,后端用request.args.get( ) 来获取参数
不需要参数时:
大多用GET请求方式
ajax多用POST 请求方式
前端的处理逻辑:
ajax 多用于局部刷新的页面(异步加载数据,减轻服务器的压力)
$.ajax({
# 要请求的链接
url:"/passport/register",
# 请求方式
type:"post",
# 请求时要携带的数据
data:JSON.stringify(params),
# 指定请求头数据格式
contentType:"application/json",
# 请求成功后的回调函数,resp用来接收请求成功后的响应
success:function(resp) {
if(resp.errno=="0"){
// 刷新当前界面
location.reload()
}else{
$("#register-password-err").html(resp.errmsg)
$("#register-password-err").show()
}
}
})
flask框架数据库配置
SQLAlchemy
Redis
CSRF 包含请求体的请求都需要开启CSRF,CSRFProtect只做验证工作
Session 利用 flask-session扩展,将 session 数据保存到 Redis 中
Flask-Script与数据库迁移扩展
导入数据库扩展,并在配置中填写相关配置
fromflask_sqlalchemyimportSQLAlchemy
importredis
fromflask_wtf.csrfimportCSRFProtect
fromflask_sessionimportSession
fromflask_scriptimportManager
fromflask_migrateimportMigrate,MigrateCommand
classConfig(object):
"""工程配置信息"""
DEBUG=True
#### 数据库的配置信息
SQLALCHEMY_DATABASE_URI="mysql://root:[email protected]:3306/information"
SQLALCHEMY_TRACK_MODIFICATIONS=False
#### redis配置
REDIS_HOST="127.0.0.1"
REDIS_PORT=6379
#### flask_session的配置信息
SECRET_KEY="EjpNVSNQTyGi1VvWECj9TvC+kq3oujee2kTfQUs8yCM6xX9Yjq52v54g+HVoknA"
SESSION_TYPE="redis"# 指定 session 保存到 redis 中
SESSION_USE_SIGNER=True# 让 cookie 中的 session_id 被加密签名处理
SESSION_REDIS=redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT)# 使用redis的实例
PERMANENT_SESSION_LIFETIME=86400# session 的有效期,单位是秒
app.config.from_object(Config)
db=SQLAlchemy(app)
CSRFProtect(app)
Session(app)
#### 命令行模式
manager=Manager(app)
#### 数据库迁移扩展
Migrate(app,db)
manager.add_command('db',MigrateCommand)
if__name__=="__main__":
manager.run( )
在Flask框架中,其自己对Python的logging进行了封装,在Flask应用程序中,可以以如下方式进行输出log日志:
current_app.logger.debug('debug')
current_app.logger.error('error')
生成 csrf_token 的值
#导入生成 csrf_token 值的函数
from flask_wtf.csrf import generate_csrf
# 调用函数生成 csrf_token
csrf_token = generate_csrf( )
将 csrf_token 的值传给前端浏览器 实现思路:可以在请求勾子函数中完成此逻辑
@app.after_request
defafter_request(response):
# 调用函数生成 csrf_token
csrf_token=generate_csrf()
# 通过 cookie 将值传给前端
response.set_cookie("csrf_token",csrf_token)
returnresponse
自定义过滤器
在 app 创建的函数里面注册过滤器
在 index.html 中使用自定义过滤器
自定义过滤器
def do_index_class(index):
"""自定义过滤器,过滤点击排序html的class"""
if index == 0:
return "first"
elif index == 1:
return "second"
elif index == 2:
return "third"
else:
return ""
在 app 创建的函数里面注册过滤器
from info.utils.common import do_index_class
# 添加自定义过滤器
app.add_template_filter(do_index_class, "index_class")
在 index.html 中使用自定义过滤器
{% for news in data.click_news_list %}
{% endfor %}
前端数据请求
1.-用JQuery的.get方法和.get方法和.post 方法发送请求
(1)get请求
$.get(url, param, function(data){
//请求成功时调用回调函数
alert(data);
});
(2)post请求
$.post(url, param, function(data,status){
alert("数据"+data+"\n状态"+status);
},"json");
//和get请求一样,只是在后面加上数据的格式,比如“json”
2.- 用JQuery的$.ajax方法发送请求
(1)get请求
$.ajax({
url: "url",
datatype:"json",
type:"GET",
success:function(e){ //成功后回调
alert(e);
},
error:function(e){ //失败后回调
alert("失败");
}
});
成功时的回调函数和失败时的回调函数;
(2)post请求
$.ajax({
url: "url",
datatype:"json",
type:"post",
data:{info:123},
success:function(e){ //成功后回调
alert(e);
},
error:function(e){ //失败后回调
alert(e);
}
});
表单异步提交
ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先引入这个插件。如下所示:
那么,如何通过ajaxSubmit(obj)提交数据呢?首先我们需要一个form,代码如下:
上面是一个需要提交内容的form,通常情况下,我们直接通过form提交的话, 提交后当前页面跳转到form的action所指向的页面。然而,很多时候我们并不希望提交表单后页面跳转,那么,我们就可以使用ajaxSubmit(obj)来提交数据。使用方法如下所示:
$('button').on('click', function() {
$('form').on('submit', function() {
var title = $('inpur[name=title]').val();
var content = $('textarea').val();
$(this).ajaxSubmit({
type: 'post', // 提交方式 get/post
url: 'your url', // 需要提交的 url
data: {
'title': title,
'content': content
},
success: function(data) { // data 保存提交后返回的数据,一般为 json 数据
// 此处可对 data 作相关处理
alert('提交成功!');
}
$(this).resetForm(); // 提交后重置表单
});
return false; // 阻止表单自动提交事件
});
});
网页分页
(网页下端的点击翻页按钮)
page指的是当前页
per_page指的是总页数
paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)
# 获取当前页查询出来的数据
items = paginate.items
# 获取到总页数
total_page = paginate.pages
# 获取到当前页
current_page = paginate.page
退出登录的实现
退出登录的实现就是通过删除数据库中的session来实现的当退出登录时,一定要清除session数据(pop),尤其是管理员退出登录时一定要清除session数据,否者普 通用户登录时会携带管理员的session数据,这样普通用户就会具备管理员权限
with app.app_context( ) 手动开启上下文