我正在研究Flask-Admin和PeeWee Backend ModelView(但我的问题也可能适用于SQLAlchemy后端),并且我在文档或示例中找不到两件事:
(1).当我的模型有一个唯一的字段并且我测试/尝试复制它时,我得到一个默认的Flask崩溃屏幕,其中显示消息:"IntegrityError:column username not unique"
我正在https://github.com/mrjoes/flask-admin/blob/master/examples/peewee/simple.py中测试PeeWee示例,我将第21行更改为"username = peewee.CharField(max_length = 80,unique = True)"
然后我尝试使用"username"="user1"添加两个用户.
是否有礼貌的方式回到编辑屏幕(甚至列表屏幕,任何管理员屏幕都会这样做),但有一个受控的错误消息?我不需要自定义错误消息,当前消息正常(IntegrityError:列用户名不是唯一的).但我不喜欢崩溃屏幕.
我可以设置/使用Flask的默认500页,但之后我将完全退出Flask-Admin流程,用户将"错过"他刚输入的数据.
我想回到编辑屏幕,但有一些警报/错误消息.我不介意扩展模板,这不是问题.但我找不到一个拦截错误并正确处理它的地方.有什么建议?
(2):
我还需要一种在流程中添加一些预保存验证的方法.例如,我是一个具有initial_date和final_date的实体的编辑形式,我想在保存之前确保final_date大于initial_date或为null.
我可以通过javascript执行此客户端,扩展该实体的编辑模板并在尾部块中添加我的验证脚本(并拦截form.submit事件).
但是,如果我的验证需要一些服务器端的最后一分钟验证呢?是否有任何方式/地方拦截流程并添加我的验证,运气好的话,以问题1中讨论的相同方式抛出我的错误信息?
提前致谢,
问候,
我正在尝试通过遵循Flask Mega教程来学习Peewee ORM与Flask的结合.在本教程的第5部分中,我使用OpenID创建了一个登录.在克服了一堆障碍之后,我现在在下面的行中粘贴的函数中得到一个AttributeError : login_user(user, remember = remember_me).
@oid.after_login
def after_login(resp):
if resp.email is None or resp.email == "":
flash('Invalid login. Please try again.')
return redirect(url_for('login'))
user = User.select().where(User.email == resp.email)
if user.wrapped_count() == 0:
nickname = resp.nickname
if nickname is None or nickname == "":
nickname = resp.email.split('@')[0]
user = User(nickname = nickname, email = resp.email, role = models.ROLE_USER)
user.save()
remember_me = False
if 'remember_me' in session:
remember_me = session['remember_me']
session.pop('remember_me', None)
login_user(user, remember …Run Code Online (Sandbox Code Playgroud) 我想使用flask peewee作为关系数据库(MySQL)的ORM,但我的问题是模型结构的变化......比如为模型添加新属性(这意味着db中的列).我想知道我是否可以自动执行此操作而无需手动编写SQL?
如何ids从 Peewee 中的批量插入中获取?
我需要返回插入的 id 来创建一个新的 dict 数组,如下所示:
a = [{"product_id": "inserted_id_1", "name": "name1"}, {"product_id": "inserted_id_2", "name": "name1"}]
Run Code Online (Sandbox Code Playgroud)
然后我需要使用批量插入它,例如:
ids = query.insertBulk(a)
Run Code Online (Sandbox Code Playgroud)
反过来,最后一个查询应该返回我的新 ID 以进行进一步的类似插入。
编辑:进一步阅读两个解决方案。
我已将Flask应用程序部署到AWS ElasticBeanstalk。应用无法读取请求中的“ 授权 ”标头。
错误日志报告:
KeyError: 'HTTP_AUTHORIZATION'
Run Code Online (Sandbox Code Playgroud)
错误追踪至:
@application.before_request
def before_request():
try:
token = request.headers['Authorization'].split(' ')[-1]
user = User.get(token=token)
g.user = user
except ValueError as e:
abort(401)
Run Code Online (Sandbox Code Playgroud)
应用程序目录:
app/
.elasticbeanstalk
application.py
virt
.ebignore
requirements.txt
Run Code Online (Sandbox Code Playgroud)
环境配置将WSGIPath设置为application.py:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: application.py
Run Code Online (Sandbox Code Playgroud)
环境运行Python 3.6和以下组件:
Click==7.0
Flask==1.0.2
Flask-RESTful==0.3.7
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.1
peewee==3.9.2
psycopg2==2.7.7
python-dotenv==0.10.1
pytz==2018.9
six==1.12.0
Werkzeug==0.14.1
Run Code Online (Sandbox Code Playgroud)
还有其他要求吗?
尝试的(失败的)解决方案:
我为此花了很多时间,并尝试配置WSGIPassAuthorization,(根据此处和其他地方的建议),但是,我没有成功。
应用程序目录包含解决方法:
app/
.elasticbeanstalk
.ebextensions/
wsgi_custom.config
application.py
virt
.ebignore …Run Code Online (Sandbox Code Playgroud) wsgi amazon-web-services python-3.x flask-peewee amazon-elastic-beanstalk
我正在尝试使用paginate查询的结果.我想使用的功能object_list中的.FlaskPeeweeplayhouse.flask_utils
您可以看到object_list似乎非常简单的示例,以下代码是我正在努力工作的代码:
from flask import Flask
from playhouse.flask_utils import object_list
from peewee import *
from database import *
@app.route("/items/")
def items():
all_items = Quote.select()
return object_list("items.html", all_items)
Run Code Online (Sandbox Code Playgroud)
该模板items.html包含以下内容:
<p>Hello world</p>
{% for item in all_items %}
<p>{{ item.text }}</p>
{% endfor %}
{% if page > 1 %}
<a class="previous" href="./?page={{ page - 1 }}">Previous</a>
{% endif %}
{% if pagination.get_pages() > page %}
<a class="next" href="./?page={{ page + …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一组可重用的数据模型,可以将其包含在多个应用程序中,如下所示(我在这里使用用户作为示例,但实际的数据模型是库的 peewee 后端Authlib):
# mixins.py
class UserMixin(peewee.Model):
username = peewee.CharField()
password = peewee.CharField()
def set_password(self):
# do stuff
...
Run Code Online (Sandbox Code Playgroud)
创建 mixin 后,我应该能够像这样导入它,仅定义附加字段(默认值已经来自 mixin)
# models.py
db = peewee.SqliteDatabase(config.get('DATABASE_FILE'))
class BaseModel(peewee.model):
class Meta:
database = db
class User(BaseModel, UserMixin):
email = peewee.CharField()
...
Run Code Online (Sandbox Code Playgroud)
我见过人们用 这样做SQLAlchemy,但是当我将这个策略与 peewee 一起使用时,它似乎没有正确保存字段:
UserMixin继承自peewee.Model,它会说“无法解析导入层次结构”(可能是因为我们peewee.Model多次导入)UserMixin只是一个object, then peewee 似乎没有正确处理它的字段:它们最终都作为未绑定的实例并且不会保存在数据库中。我的问题:是否有一种“官方方式”来创建带有peewee字段的可重用模型混合?
我见过其他项目(例如flask-login)使用 mixins,但这些通常是像本示例中那样的附加函数set_password,而不是定义字段本身的函数。
我有一些潜在的替代解决方案,例如
.Meta.database为每个models.py …我有一个非常简单的设置、pipenv Flask 环境中的模型和 api 文件。我目前正在使用 peewee,并面临着从数据表获取所有结果的问题。我以前在 python 中做过这个并且工作得很好,但是不确定在 Flask 中我做错了什么。这是我的模型
from peewee import *
import peewee as pw
db = pw.MySQLDatabase('xxxxx', host="localhost", port=3306, user='xxx',
password="xxxxx")
class HomeCarousel(Model):
icon = pw.CharField(100)
header = pw.CharField(50)
text = pw.CharField(100)
class Meta:
database = db
Run Code Online (Sandbox Code Playgroud)
这是我的 api 文件
from flask import Flask, g
from flask import jsonify, make_response
from playhouse.shortcuts import model_to_dict
from peewee import *
import peewee as pw
from models import *
from flask_cors import CORS
app = Flask(__name__)
cors = CORS(app, …Run Code Online (Sandbox Code Playgroud) flask-peewee ×8
python ×7
peewee ×5
flask ×4
python-3.x ×2
flask-admin ×1
oop ×1
pagination ×1
validation ×1
wsgi ×1