我正在开发一个在树莓派上运行的开源离线金字塔应用程序,所以我想让一切尽可能简单和高效。该应用程序正在使用 sqlalchemy 愉快地与我的 postgresql 数据库通信。我不想通过使用 Deform 或其他小部件或添加身份验证或使用会话 cookie(如 Pyramid Doc 示例中)使事情复杂化。我使用 twitter 引导程序的模板(变色龙)包含一个表单(片段):
<form action="." method="post">
<a class="btn" href="#" id="actionbtn" onclick="camCapture()">Capture</a>
<p><input type="text" class="input-small' id="projfld" value="Project Name">
<p><label class="control-label" for "select01">Brightness</label>
<div class="btn-group' data-toggle="buttons-radio" id="bright">
<button type="button" class="btn btn-small" id="btnoff">Off</button>
<button type="button" class="btn btn-small" id="btn10">10%</button>
<button type="button" class="btn btn-small" id="btn50">50%</button>
<button type="button" class="btn btn-small" id="btnfu">Full</button>
</div>
<p><label class="checkbox"><input type="checkbox" id="auto">Auto</label>
</form>
表单中还有其他按钮和字段,但这就是多样性。当用户单击模板中的 javascript 操作时:
function camCapture()
{
jQuery.ajax({
url: '/camcapture',
dataType:"json",
type: 'POST',
data: "test",
});
}
正在触发views.py中的函数(下面的修剪代码)并使用sqlalchemy将系统数据添加到postgresql数据库中。
@view_config(renderer="json", name="camcapture")
def camcapture_view(self):
#
# stuff happens
#
now = datetime.datetime.utcnow()
outfile = ("/home/brian/cam/%s" % now.strftime("CAM_%Y%m%d%H%M%S") + ".jpg")
cam_event = Event('fileprefix',now,'CAM',outfile,'memo field content','project')
DBSession.add(cam_event) # data, Event arguments above, are written to database
#
# other stuff happens
#
return []
用户只需返回原始页面(无需重定向),因为他们可能会更改一个或多个字段中的数据并再次提交表单。
我认为这是一个常见的应用程序,但我找不到帮助像我这样的新开发人员的示例或教程。也许它太简单了,我错过了重要的基本信息?我的数据库架构是,我相信在 models.py 中适当定义:
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import ZopeTransactionExtension
engine = create_engine('postgresql://scan:scan@localhost:5432/scan', echo=True) # Establishes SQLAlchemy link to postgresql db
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
class ORMClass(object): # Allows grabs of database values as variables in python
@classmethod
def query(class_):
return DBSession.query(class_)
@classmethod
def get(class_, record):
return Session.query(class_).get(record)
Base = declarative_base(cls=ORMClass)
class Event(Base): #Schema description which allows automated table generation if it doesn't already exist
__tablename__ = 'event'
record = Column(Integer, Sequence('event_record_seq'), primary_key=True, nullable=False)
fileprefix = Column(String)
date = Column(DateTime, nullable=False)
eventtype = Column(String(3))
filename = Column(String)
memo = Column(String)
project = Column(String)
extend_existing = True
def __init__(self, fileprefix, date, eventtype, filename, memo, project): #constructor for new event records
self.fileprefix = fileprefix
self.date = date
self.eventtype = eventtype
self.filename = filename
self.memo = memo
self.project = project
def __repr__(self):
return "<Event('%s','%s','%s','%s','%s','%s')>" % (self.fileprefix, self.date, self.eventtype, self.filename, self.memo, self.project)
Base.metadata.create_all(engine)
谢谢你。是的,@Sergey,我在访问 JSON 字典中的值时遇到问题。在发布我的查询之前,我已经完成了该教程。在我尝试模拟它时,我使用 stringify 来构造 JSON 主体。我正在获取表单信息并将值设置为变量。
jsondata= JSON.stringify({"var1name" : $(#projfld").val(), "var2name" 等等。
在我的帖子上-> 数据:jsondata。
在教程中,他们打印元组。我正在尝试将每一对设置为在代码中使用的变量,但找不到执行此操作的语法。我想做类似的事情
var1 = request.json_body(index(0))、var2 = request.json_body(index(1)) 等等。
在上面的简化版本中,我将字符串“test”作为 JSON 数据发送。然后我可以在我的 Python 代码中将一个字符串设置为该字符串,但是如何解析 JSON 正文的各个部分?variablez = request.json_body 是等效的教程示例。由于元组包含名称和值对,我认为变量可能已经在正文中声明,我可以在我的代码中使用它们并将一些值发送到我的数据库。
我不使用简单提交按钮的原因是表单上有几个按钮(提到),每个按钮都会从表单中获取不同的信息,并在服务器端激活不同的代码以立即执行硬件操作(在这种情况下发送串行命令)。您是否试图建议在字段中按 enter 将自动提交表单?不是真的,至少不是在我正在使用的系统上(我可以在这个离线应用程序中控制它)。