class ApprovalStatus(PyEnum): PENDING = 'pending' APPROVED = 'approved' REJECTED = 'rejected' class Approval(db.Model): id = db.Column(db.Integer, primary_key=True) content_type = db.Column(db.String(50), nullable=False) content_id = db.Column(db.Integer, nullable=False) field_name = db.Column(db.String(50), nullable=False) new_value = db.Column(db.Text, nullable=False) status = db.Column(db.Enum(ApprovalStatus), default=ApprovalStatus.PENDING) submitter_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) submit_time = db.Column(db.DateTime, default=current_time) reviewer_id = db.Column(db.Integer, db.ForeignKey('user.id')) review_time = db.Column(db.DateTime, default=current_time) review_comment = db.Column(db.Text) submitter = db.relationship('User', foreign_keys=[submitter_id]) reviewer = db.relationship('User', foreign_keys=[reviewer_id]) __table_args__ = (db.UniqueConstraint('content_type', 'content_id'),) @property def content(self): model = getattr(models, self.content_type) return model.query.get(self.content_id)
模型是这样,但是在 flask admin 访问审核这个栏目的时候,总是提示
LookupError: 'pending' is not among the defined enum values. Enum name: approvalstatus. Possible values: PENDING, APPROVED, REJECTED
和解哦。
结果检查,数据库的状态栏的值都是小写的。
]]>我有一个视图函数,它理应在后台获取当日的数据(每天的数据不一样),然后渲染到前端,但访问得到的数据却是上一次访问得到的数据(即它不会自动更新视图),如果我提前在视图渲染函数前 return 一个任意字符串,刷新请求,然后恢复代码,它又成功地更新视图了。
我的猜测
代码逻辑应该没有问题,问题大概率是关于缓存的,不知 flask 是否有自动缓存机制,请大佬解惑。先行感谢🙏。
]]>目前自己实现了部分,但是有些细节还有些疑惑,想找个案例来梳理学习下。
大佬们 求推荐相关的资料下。
]]>app = create_app() # mail client mail = Mail(app)
配置文件:
# flask_mail MAIL_DEBUG = False MAIL_SUPPRESS_SEND = False MAIL_SERVER = 'smtp.qq.com' MAIL_PORT = 465 MAIL_USE_SSL = True MAIL_USE_TLS = False MAIL_USERNAME = os.getenv("MAIL_USERNAME") or "xxxx@qq.com" MAIL_PASSWORD = os.getenv("MAIL_PASSWORD") or "xxxxxxxxxxx" # QQ 邮箱授权码
发送邮件代码:
@celery.task def send(mail_from, mail_to, subject="", cOntent="", html=""): try: msg = Message( subject=subject, sender=mail_from, recipients=[mail_to] ) msg.body = content msg.html = html mail.send(msg) except Exception as e: return e.__str__() return "ok" send.delay("xxxx@qq.com", "xxxxx@qq.com", "test", "content")
错误信息:
(535, b'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')
不知道哪里出了问题,到网上搜了一圈,这个配置没错,就是账户验证失败,就很难受。
]]>django 和他的 orm 结合紧密,但是 flask 似乎并不是的。
]]>按照新手村教程,一开始 pip3 install flask 安装完毕后,运行新手村 HelloWorld 程序,提示 ImportError: No module named 'flask'
于是,pip3 uninstall flask
采用手工安装的方式,git 了 flask 到本地
cd flask 进入目录
执行安装
python3 setup.py install
然后,
提示:ImportError: No module named 'flask'
好吧,我去考驾照,交警告知我没有驾照,所以不允许考驾照……
]]>if __name__ == '__main__': app.run(host='0.0.0.0', port=9000)
Dockerfile 如下:
FROM python:3.7-buster WORKDIR /app/ COPY ./requirements.txt /app/requirements.txt RUN pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ COPY . /app/ EXPOSE 9000 ENV FLASK_APP=server.py CMD python -m flask run --host=0.0.0.0 -p 9000
下面这样子可以访问到 localhost:9000 。
docker container run --name user-info-pool-service -d -p 9000:9000 user-info-pool-service
但是下面这样却不行。
docker container run --network=host --name user-info-pool-service -d user-info-pool-service
真的好奇怪,为什么呢?
]]>之前是开源的 php 程序,如果代码升级,操作都是进入后台,打开关闭网站,然后 ftp 上传代码,再打开网站。 网站有一定数量的会员访问。
后来自己用 flask 重写了代码, nginx+gunicorn+flask 部署,代码用 git 拉取, 现在更新网站方式: 代码用 git 拉取,然后 pstree -ap|grep gunicorn kill -HUP PID
感觉很怪异,特来问问大家有什么好方式?谢谢
]]>login_bp = Blueprint("login_bp", __name__, url_prefix="/api/v1") class LoginView(Resource): @marshal_with(user_fields) def get(self): users = User.query.all() # print(users) return users # return {"code":0 ,"msg": "中文测试"} api.add_resource(LoginView, "/login")
Flask-Login
的user_loader
回调方法的问题 前两天看到 lepture 关于 Flask 项目结构的这篇文章https://lepture.com/en/2018/structure-of-a-flask-project, 动手实践一下, 但是遇到个 Flask-Login 的问题, user_loader
方法放在哪儿都不好使, 总是报Exception: Missing user_loader or request_loader. Refer to http://flask-login.readthedocs.io/#how-it-works for more info.
我认为的是在项目启动之后login_manager
已经和app
关联了, 所以在 router 中引用的login_manager
就可以设置user_loader
回调方法了, 但是不管我把它放哪儿, 始终都找不到, 在引用current_user
的时候就报错 Exception: Missing user_loader or request_loader. Refer to http://flask-login.readthedocs.io/#how-it-works for more info.
下面是项目结构, 部分文件截图以及报错信息, 路过的大神麻烦帮忙看看是什么问题.
flask_login
的UserMixin
类)麻烦大神们指教或者有什么思路说说, 先谢过.
FlaskCon 是由社区举办的免费线上 Flask 会议,欢迎参加。
]]>全文搜索的类变量里,传的 cls 是什么意思?不是太理解:
class SearchableMixin(object): @classmethod def search(cls, expression, page, per_page): ids, total = query_index(cls.__tablename__, expression, page, per_page) if total == 0: return cls.query.filter_by(id=0), 0 when = [] for i in range(len(ids)): when.append((ids[i], i)) return cls.query.filter(cls.id.in_(ids)).order_by( db.case(when, value=cls.id)), total ......
]]>return redirect(url_for('auth.login', next='?q=foo'))
return redirect(url_for('auth.login', next='/?q=foo'))
虽然上面两种写法结果都一样,那种写法更符合规范呢?
]]>用途:放在网站上使用 video 标签播放
问题:video 标签的 html 播放似乎都是在边加载边播放,还可以跳进度什么的。浏览器是怎么请求服务器的?我应该在服务器上怎么这样的程序?是断点续传那样加载的吗?
]]>目前的方法是: sqlalchemy
+ xlrd
db.session.bulk_insert_mappings()
把数据查出来和 excel 内的数据做对比
-- 但是感觉 2 这样做好蠢,不知道有没有什么更好的方法,有人分享下吗
]]>flask_restful.abort = api_abort def api_abort( httpcode=400, errcode=None, message=None, key=""): res = BaseResponse() res.errcode = errcode or 4011 if message: res.errmsg = message else: res.errmsg = key + codetype.get(res.errcode) res.dict.pop('data') if httpcode == 200: print(123456, res.dict) return jsonify(res.dict), httpcode return abort( httpcode, **res.dict)
@app.after_request def after_request(response): # 允许跨域 response.headers.add('Access-Control-Allow-Origin', '*') if request.method == 'OPTIONS': response.headers['Access-Control-Allow-Methods'] = 'POST, DELETE, PUT, GET' headers = request.headers.get('Access-Control-Request-Headers') if headers: response.headers['Access-Control-Allow-Headers'] = headers return response
当 return abort( httpcode, **res.dict) 状态码 400 提示跨域
在构造查询条件的时候,会传入一个 begin_time 和 end_time,查询 col_a 中是否有某个时间在 begin_time 和 end_time 之间,如果有,条件成立,否则条件不成立。
正常来说,如果 col_a 是一个日期,sqlalchemy 中用 between 就可以了,但是现在 col_a 是一个有多个递增日期的列表,原生 sql 我都想不出来怎么写,sqlalchemy 是不是也没法直接写出来。
目前能想到的就是先取出所有 table 的记录,遍历一遍 col_a 列,把所有满足条件的记录存储成一个临时表,然后在临时表的基础上再构造其他查询条件。
还有其他方案吗?(感觉这个有点蛋疼,我愿意为知识付费 20 元。
]]>第一、我想再添加一个 age=18 的 cookie 值,该怎么做呢(多个 cookie ) 第二、如何在名为 name 的 cookie 里添加多个关键字的值呢,比如:name={uuu “:28,” ttt “:34}这种的(一个 cookie 里多个值)
]]>flask_caching
倒是跟新的比较好,使用也很 OK,但是我很奇怪的是,难道大家都不用第三方的插件作为缓存吗,为什么星星都这么少? 补充 是不是直接使用的自带的缓存?我发现自带的也是可以用的,完全 OK
from werkzeug.contrib.cache import RedisCache
项目结构(部分)
--app --auth __init__.py views.py --run.py
然后我看到auth.__init__.py
这样注册蓝图
from flask import Blueprint auth = Blueprint('auth', __name__) from . import views
而在auth.views.py
中又引用了 auth
from . import auth @auth.route('/unconfirmed') def unconfirmed(): if current_user.is_anonymous or current_user.confirmed: return redirect(url_for('main.index')) return render_template('auth/unconfirmed.html')
我的理解是这两个文件里面在循环调用 auth 这个蓝图,这样做真的可以吗(当然运行没问题,我问的可以是这样的引用方式是否合理?)
说说我的做法,我在 views 里面不会引用 auth,而是这是一个函数,传入 auth,然后__init__.py
中引入这个函数来注册蓝图
#__init__.py from flask import Blueprint from .views import init_blueprint bp = Blueprint('main', __name__) def init_app(app): init_blueprint(bp) app.register_blueprint(bp) #views.py from flask import jsonify, current_app def index(): return '' def init_blueprint(bp): bp.add_url_rule('/', 'home', index)
我这样做主要是避免循环引入,求解释上面的那个代码算不散循环导入?这 2 个方式最大的区别在于第一种可以使用装饰器,第二种只能使用 add_url_rule 去注册路由
项目源码: https://github.com/miguelgrinberg/flasky/blob/master/app/auth/views.py
]]>github 地址: https://github.com/baichen99/WeSHU
demo 地址: http://39.108.119.41/
flask 只学了一个多月, 前端基本不会, 肯定是存在很多问题的, 希望大家能提点建议
]]>access_token
) access_token=request.header.get_all("access_token")
使用如下代码获取请求头中的数据,可以拿到值(客户端也使用access-token
)
access_token=request.header.get_all("access-token")
在 Servlet 和 .net Core 中都可以使用下划线格式的请求头名称,为什么 Flask 不可以,是需要额外配置吗?
请问这是为什么?
]]>在 Flask 内通过 win32com 调用 Word 就会失败,不通过 Flask 就能正常调用。
应该是权限的原因吧? 应该怎么办?
第一次用 Flask,请大神轻拍~
]]>class MyAnonymousUser(AnonymousUserMixin):
def can(self, permissions): return False def is_administrator(self): return False
login_manager.anonymous_user = MyAnonymousUser
在视图函数中使用了 can 方法:
@main.route('/', methods=['GET', 'POST'])
def index():
form = PostForm() if current_user.can(Permission.WRITE_ARTICLES) and form.validate_on_submit(): post = Post(body=form.body.data, author=current_user._get_current_object())
结果运行出现'AnonymousUserMixin' object has no attribute 'can'的错误,请问下问题出在哪里?登录用户能够正常调用角色验证方法。
]]>