我开始从Flask Mega Tutorial中学习这些东西.当他进入多对多关系时,他会创建一个如下关联表:
followers = db.Table('followers',
db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)
Run Code Online (Sandbox Code Playgroud)
当我在寻找添加一些关于模型之间特定关联的元数据的方法时,我发现你可以在关联表中存储这种东西.但是我发现的这个例子似乎使得关联表成为一个真实的模型.
class DepartmentEmployeeLink(Base):
__tablename__ = 'department_employee_link'
department_id = Column(Integer, ForeignKey('department.id'), primary_key=True)
employee_id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
extra_data = Column(String(256))
department = relationship(Department, backref=backref("employee_assoc"))
employee = relationship(Employee, backref=backref("department_assoc"))
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别?将元数据存储在关联表中是否需要模型方法,或者使用top方法可以完成同样的事情?
谢谢!
many-to-many sqlalchemy model-associations flask flask-sqlalchemy
不记得我在哪里读到这个,但无论是在这里的某个地方,还是在我关注的教程的评论中,一个人说:
'永远不要使用sudo pip install; 你可以在不知情的情况下覆盖重要的东西.使用pip install --user代替!'
虽然我看到很多关于sudo pip安装的引用,所以这个人知道他们在谈论什么,我应该避免它,或者......?
我正在使用此处找到的模板:是否可以在Windows中将Python脚本作为服务运行?如果可能,怎么样?
这是我的run.py,我按照上面链接中的说明安装了服务.
from app import app
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "Flask App"
_svc_display_name_ = "Flask App"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.main()
def main(self):
app.run(host = '192.168.1.6')
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试启动服务时,我收到消息:
"本地计算机上的Flask App服务已启动然后停止.如果某些服务未被其他服务或程序使用,则会自动停止."
知道我做错了什么吗?我尝试了各种用户帐户 - 我不认为这是一个权限问题.
谢谢!
我很好奇是否有办法显示当前会话中的内容?
或者也许是一种检查会话是否为空的方法,以便我可以执行类似下面的操作.
if db.session:
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
这样,只有在会话中的某些内容等待提交时才会提交.
在这里阅读了一些关于盐渍密码的信息后,似乎最好为每个用户使用一种独特的盐.我正在努力实现Flask-Security atm,从文档看来你只能设置一个全局盐:即SECURITY_PASSWORD_SALT ='thesalt'
问题:如何为每个密码制作一个独特的盐?
谢谢!
编辑:从Flask-Security上的文档中我发现了这一点,这似乎再次暗示这个模块只对开箱即用的所有密码使用一个盐.
flask_security.utils.get_hmac(password)
Returns a Base64 encoded HMAC+SHA512 of the password signed with the salt
specified by SECURITY_PASSWORD_SALT.
Run Code Online (Sandbox Code Playgroud) 我不确定我是否正确地提出了这个问题.我可以为我的任何表添加一个独特的约束,但在下面的情况下,我不知道如何做我想要的事情:
class Branch(db.Model):
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(160))
#foreign key for 'branches' in Account class. access with Branch.account
account_id = db.Column(db.Integer, db.ForeignKey('account.id'))
class Account(db.Model):
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(160), unique=True)
branches = db.relationship('Branch', backref = 'account', lazy = 'dynamic')
Run Code Online (Sandbox Code Playgroud)
因此,当我向Branch表的name列添加唯一约束时,我无法将同名分支添加到不同的帐户.例如,西雅图可能是AccountA和AccountB的分支.
我想要做的是应用仅在account.id相同时检查唯一性的约束.这可能吗?
关于如何使用WTForms的FieldList,确实缺乏文档.所以,多亏了互联网,我已经能够将以下内容整合在一起:
形成:
class BranchForm(Form):
name = StringField('Name', validators = [Required()])
equipment = FieldList(SelectField('Equipment', validators=[Required()], coerce=int,
choices = [(x.id, x.name) for x in Equipment.query.all()]))
mod = FieldList(StringField('Method of Delivery', validators = [Optional()]))
Run Code Online (Sandbox Code Playgroud)
视图:
def edit_branch(id):
branch = Branch.query.filter_by(id=id).first()
#populate data_in to be used by BranchForm
data_in = []
for eq_obj in branch.equipment_assoc:
data_in.append(('equipment', eq_obj.equipment.id))
data_in.append(('mod', eq_obj.mod))
editform = BranchForm(data=MultiDict(data_in))
if editform.validate_on_submit():
branch.name = editform.name.data
db.session.add(branch)
db.session.commit()
return redirect('/admin/branches/' + str(branch.id))
editform.name.data = branch.name
return render_template("branch_edit.html",
title="Edit Branch",
branch = branch,
editform …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的 MySQL docker 容器设置持久数据卷。
我正在使用在 Dockerfile 中有这个的官方 MySQL 镜像:
卷/var/lib/mysql
如果我调用
-v /var/lib/mysql:/var/lib/mysql
在运行时,我的命令优先,还是必须从 Dockerfile 中删除 VOLUME 声明?
只是好奇,因为它似乎并没有像我预期的那样阻止更长的字符串存储在数据库中。
如果无关紧要,为什么还要定义它呢?(它必须做点什么!)
class Message(db.Model):
id = db.Column(db.Integer, primary_key = True)
tag = db.Column(db.String(12))
description = db.Column(db.String(120))
copy = db.Column(db.String)
voice = db.Column(db.String(24))
Run Code Online (Sandbox Code Playgroud) libphonenumber是一个非常令人困惑的工具,无法考虑在网络上找到的大量实现和示例,因此请耐心等待。
我很想尝试通过HTML文件中的脚本标签使用此包,就像我已经使用过其他所有JavaScript库(如jQuery)一样。
我已按照此处的说明使用Google的撰写工具来编译libphonenumber
因此,对于这个单一文件,我尝试如下使用。但是,无论我尝试了什么,我似乎都无法访问其中的任何方法。
<script type="text/javascript" language="javascript" src="/static/js/libphonenumber.js"></script>
<script type="text/javascript">
$(".phone-format").keyup(function () {
// Don't reformat backspace/delete so correcting mistakes is easier
if (event.keyCode != 46 && event.keyCode != 8) {
var val_old = $(this).val();
var newString = new libphonenumber.i18n.phonenumbers.AsYouTypeFormatter('US').input(val_old);
$(this).focus().val('').val(newString);
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
完全不支持此使用情况吗?
flask ×6
python ×5
sqlalchemy ×4
mysql ×2
alembic ×1
docker ×1
dockerfile ×1
encryption ×1
fieldlist ×1
forms ×1
html ×1
javascript ×1
many-to-many ×1
one-to-many ×1
pip ×1
salt ×1
service ×1
session ×1
sqlite ×1
sudo ×1
volume ×1
windows ×1
wtforms ×1