flask 杂记2
添加属性
@property
def password(self):
return self._password @password.setter
def password(self, raw):
self._password = generate_password_hash(raw)
=========自定义上下文管理器的一种方法
上下文管理器的一种应用
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self, throw=True):
try:
yield
self.session.commit()
except Exception as e:
self.session.rollback()
current_app.logger.exception('%r' % e)
if throw:
raise e
========表单自定义验证,自定义验证定义了即会被自动调用
class RegisterForm(EmailForm):
nickname = StringField('昵称', validators=[
DataRequired(), Length(, , message='昵称至少需要两个字符,最多10个字符')]) password = PasswordField('密码', validators=[
DataRequired(), Length(, )]) def validate_email(self, field):
if User.query.filter_by(email=field.data).first():
raise ValidationError('电子邮件已被注册')
=====================
防止参数为空:用DataRequired
from wtforms.validators import DataRequired
class Base(db.Model):
__abstract__ = True #这是个基类,不想让sqlalchemy创建
create_time = Column('create_time', Integer)
status = Column(SmallInteger, default=)
def set_attrs(self, attrs):
for key, value in attrs.items():
if hasattr(self, key) and key != 'id':
setattr(self, key, value)
配置文件中的key一定要是大写,小写会找不到
=============
返回json字符串可以用jsonify
static_url_path: 访问静态资源的url前缀
当装饰器和请求方式完全相同时,那么执行的是第一个,如果装饰器相同但是请求方式不相同,那么它们将是独立的个体
# 通过url_map可以查看整个flask中的路由信息
print(app.url_map)
路由中参数类型:
示例:@app.route("/goods/<int:goods_id>")
定义自己的类型转换器:https://mp.weixin.qq.com/s/eyfuFdOcMJiEuCAWGNpLag
from werkzeug.routing import BaseConverter
class MobileConverte(BaseConverter)
request对象中保存了一次HTTP请求的一切信息
postman 下载地址: https://www.getpostman.com/downloads/
当我们从前端发送的数据如果是表单的数据就可以直接从form里面进行提取,如果不是表单数据那我们无法form中提取东西,我们只能从data当中去提取请求体当中的数据
http://127.0.0.1:5000/post?city=hunan url中的参数通过request.args.get("city")得到
上传文件主要用了request当中属性files
abort函数:它可以终止视图函数的执行并且还可以返回给前端特定的信息,若传递状态码则,必须是http标准状态码
自定义错误处理方法 :@app.errorhandler(404)
通过元组的形式,返回自定义的响应信息
除了一些规定的状态码,我们也可以返回自定义的状态码
通过make_response 设置返回内容
app.route("/index")
def index():
resp = make_response("index page")
resp.status = ""
resp.headers["city"] = "hn"# 设置cookie
resp.set_cookie("Itcast", "python")
return resp
返回json数据
@app.route("/index")
def index():
data = {
"name":"javaandpython",
"age":20
}
return jsonify(data) jsonify不仅可以帮我们把字典转为json格式,还能帮我们把响应头中的Content-Type设置为application/json
cookie的默认有效期是临时cookie,浏览器关闭就会失效
resp.set_cookie("Itcast", "python", max_age=3600) 通过max_age设置有效期单位是秒
获取cookie:c = request.cookies.get("Itcast")
删除cookie
@app.route("/delete_cookie")
def delete_cookie():
resp = make_response("del success")
resp.delete_cookie()
return resp
其实在删除cookie当中,并不是真正的删除,只是把当前需要删除的cookie的有效期设置为了创建时候的时间,所以相当于是删除了cookie
在Flask当中如果我们需要使用session,那么我们必须配置app当中的SECRET_KEY参数,否则程序会报错。参数的值我们可以任意编写
app.config["SECRET_KEY"] = "123FIISUODFNOSAIFNHASIJDdasd"
request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
session:用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息
利用“上下文对象”将request对象作为全局变量,此时这个request对象就是在这个线程中的全局变量。但是如果这个对象是在A线程当中那么他就是A线程中的全局变量,在其他线程(B线程,C线程...)当中不是全局变量,这样就可以保证对象不会混淆
request和session都属于请求上下文对象
current_app和g都属于应用上下文对象。
.before_first_request : 在第一次请求之前运行,只执行一次,如链接数据库 .before_request : 在每一次请求都会执行,可以在这里做权限校验操作,比如说某用户是黑名单用户,黑名单用户登录系统将遭到拒绝访问,可以使用before_request进行权限校验。 .after_request :在请求之后运行,会接收一个参数,这个参数就是前面的请求处理完毕之后, 返回的响应数据,如果需要对响应做额外处理,可以再这里进行。 .teardown_request :每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
userlog 把user.id当作外键,则选要在user定义时,需要加上外键关系
class User(db.Model):
__tablename__ = "user"
__table_args__ = {"useexisting": True}
id = db.Column(db.Integer, primary_key=True) # 编号
name = db.Column(db.String(), unique=True) # 昵称
pwd = db.Column(db.String()) # 密码
email = db.Column(db.String(), unique=True) # 邮箱
phone = db.Column(db.String(), unique=True) # 电话号码
info = db.Column(db.Text) # 个性简介
face = db.Column(db.String(), unique=True) # 头像
addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间
uuid = db.Column(db.String(), unique=True) # 唯一标志符
userlogs = db.relationship('UserLog', backref='user') # 会员日志外键关系
comments = db.relationship('Comment', backref='user') # 评论外键关系关联
moviecols = db.relationship('MovieCol', backref='user') # 电影收藏外键关系关联 # 定义会员登录日志模型
class UserLog(db.Model):
__tablename__ = "userlog"
__table_args__ = {"useexisting": True}
id = db.Column(db.Integer, primary_key=True) # 编号
user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属会员
ip = db.Column(db.String()) # 登录IP
addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间
================
在模板中的操作:
1、静态文件的引入
{{ url_for('static',filename='文件路径')}}
2、定义路由
{{ url_for('模块名.视图名',变量=参数)}}
3、定义数据块
{%block 数据块名称%} .....{% endblock %}
==================
index.html继承了home.html,index.html和home.html 在同级目录,要加上 home
{% extends "home/home.html" %} <!-- 不能写成这样 {% extends "home.html" %}-->
{% block content %} <h1>Helo,World!</h1> {% endblock %}
=============把一个页面添加到另一个页面
{% include "home/menu.html" %}
================
# 登录装饰器
def user_login_req(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if "user" not in session:
return redirect(url_for("home.login", next=request.url)) #登陆之后,跳到用户想访问的页面
return f(*args, **kwargs)
return decorated_function
====================
def login():
form = LoginForm()
if form.validate_on_submit():
data = form.data
user = User.query.filter_by(name=data["name"]).first()
if not user.check_pwd(data["pwd"]):
flash("密码错误!", "err")
return redirect(url_for("home.login"))
session["user"] = user.name
session["user_id"] = user.id
userlog = UserLog(
user_id=user.id,
ip=request.remote_addr # 获取用户的登陆地址
)
db.session.add(userlog)
db.session.commit()
return redirect(url_for("home.user"))
return render_template("home/login.html", form=form) # 是相对templates的相对地址
=============
from werkzeug.security import generate_password_hash
pwd=generate_password_hash(data["pwd"]) #密码加密
from werkzeug.security import check_password_hash
return check_password_hash(self.pwd, pwd) #密码是否与数据库中的一致
==============
if request.method == "GET": # 给它们赋初始值
===========
Response(resp, mimetype='application/json') #告诉浏览器资源的类型,浏览器根据资源类型决定如何处理服务器返回的内容
==========多表关联查询
page_data = Comment.query.join(
Movie
).join(
User
).filter(
Movie.id == movie.id,
User.id == Comment.user_id
).order_by(
Comment.addtime.desc()
).paginate(page=page, per_page=)
==========添加多条记录
db.session.add_all(user_list)
db.session.commit()
=======跨域访问
https://www.cnblogs.com/anxminise/p/9814326.html
跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源
pip install Flask-Cors
from flask_cors import CORS
=================
Flask-Limiter对flask的路由功能提供访问速率限制的功能。访问的信息可以存储到应用本身的内存里,或者存储到redis、memcache里
from flask_limiter import Limiter
======性能调试工具:每行代码的执行时间==========
https://blog.csdn.net/guofangxiandaihua/article/details/77825524
from line_profiler import LineProfiler
from line_profiler import LineProfiler
import random def do_other_stuff(numbers):
s = sum(numbers) def do_stuff(numbers):
do_other_stuff(numbers)
l = [numbers[i]/ for i in range(len(numbers))]
m = ['hello'+str(numbers[i]) for i in range(len(numbers))] numbers = [random.randint(,) for i in range()]
lp = LineProfiler()
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)
这样做的话,只能显示子函数的总时间
————————————————
版权声明:本文为CSDN博主「红色未来」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guofangxiandaihua/article/details/77825524
为了能够同时显示函数每行所用时间和调用函数每行所用时间,加入add_function就能够解决
from line_profiler import LineProfiler
import random def do_other_stuff(numbers):
s = sum(numbers) def do_stuff(numbers):
do_other_stuff(numbers)
l = [numbers[i]/ for i in range(len(numbers))]
m = ['hello'+str(numbers[i]) for i in range(len(numbers))] numbers = [random.randint(,) for i in range()]
lp = LineProfiler()
lp.add_function(do_other_stuff) # add additional function to profile
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)
lp.print_stats()
=========
@app.route("/index/") 写成这样的话,/index和/index/都能访问此视图函数
@app.route("/index") 写成这样的话,/index/是无法访问的
打开debug=TRUE模式后,后端的修改会导致flask重启,是修改立即生效
添加路由函数的另一种方法:app.add_url_rule('/index',view_func=hello) 基于类的视图需要这样添加视图函数
flask 杂记2的更多相关文章
- flask 杂记3
SQLAlchemy在模型之间建立关系模式: https://www.bbsmax.com/A/mo5k7gKn5w/ 一对多时:外键只能存储单一数据(标量),所以外键总是在“多”这一侧定义,多篇文 ...
- flask 杂记
参考资料:http://python.jobbole.com/84003/ https://flask-cn.readthedocs.io/en/latest/tutorial/ 加载配置: app ...
- [Flask]学习杂记--模板
这个学习杂记主要不是分享经验,更多是记录下falsk的体验过程,以后做东西在深入研究,因为django之前用的时间比较长,所以很多概念都是一看而过,做个试验了解下flask的功能. flask中使用是 ...
- [Flask]学习杂记一 Hello程序
这几天买了本 <Flask Web开发:基于Python的Web应用开发实战>,之前也用过flask 但是不怎么系统,有时候需要搭建一些临时的测试服务,用falsk比较方面,一个文件就可 ...
- 使用Nginx+Uwsgi部署Python Flask项目
第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...
- flask+sqlite3+echarts2+ajax数据可视化
前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- Windows下快速安装Flask的一次经历
前提: 1.已安装python版本(一般都是2.X) 2.已安装easy_install python安装,记得配置Python的环境变量,例如:我的直接在Path上加 G:\Python 验证安装P ...
- [Erlang 0118] Erlang 杂记 V
我在知乎回答问题不多,这个问题: "对你职业生涯帮助最大的习惯是什么?它是如何帮助你的?",我还是主动回答了一下. 做笔记 一开始笔记软件做的不好的时候就发邮件给自己, ...
随机推荐
- PHP替代session的方法
PHP替代session的方法 服务器集群的时候 会发现session的问题 一般采用redis 来代替 用账号作为key 因为redis能主从 所以打算用替代session的方法1 cookie代替 ...
- 三、部署DNS
通常情况下配置好域后,DNS会默认安装好,但有时候这个DNS只能解析域控的域名,不能解析其他域名,比如baidu.com之类的.此时需要配置转发器,把不能解析的域名转到其他DNS配置如下: 打开DNS ...
- 2019年广东省赛gdccpc回顾
本次比赛状态一般般,热身赛单人挂机爆零让自己慌了一整天. 开题直接抓E题入手,准备交题后关机(辣鸡云桌面),开机后又告诉我要关机,心急连交两发结果都WA了,最后靠队员提醒救了回来.心态还算稳住了.后面 ...
- html5 canvas 自定义画图裁剪图片
html5 给我们带来了极大惊喜的canvas标签,有了它我们可以在浏览器客户端处理图片,不需要经过服务器周转.可以实现: 1.照片本地处理,ps有的一些基本功能都有 2.结合js可以实现一些很炫的动 ...
- PHP被忽略的基础知识
目录 下列PHP配置项中,哪一个和安全最不相关:() 字符串比较函数 格林时间 在PHP面向对象中,下面关于final修饰符描述错误的是( ) getdate()函数返回的值的数据类型是:( ) 关于 ...
- 人工智能对人类有哪些影响 选择Python入门怎样
人工智能对人类有哪些影响?选择Python入门怎样?人工智能是科技时代进步的产物,也是目前人们非常关注的一个产业.那么,随着人工智能的发展,对人类生活的有哪些影响呢? 1.人工智能对文化产业影响 据了 ...
- 模板模式(Template Pattern)
模板模式(Template Pattern) -- 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. ...
- Dockerfile编写,以及设置一个自启动脚本
FROM:指定基础镜像,必须为第一个命令 MAINTAINER: 维护者信息 RUN:构建镜像时执行的命令 ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问 ...
- Golang安装和配置
Golang安装和配置 Linux Golang 下载源码,解压. # /home/superpika为你的主目录 mkdir /home/superpika/go mkdir /home/super ...
- SQL Server2008本地数据库调用SP发送邮件
一.首先要对本地数据库做配置 1.通过使用数据库邮件配置向导和sp_configure存储过程配置启用数据库邮件: 注:服务器名称填写发送服务器的路径或者IP,电子邮件地址为寄件者地址 配置好数据库邮 ...