0

我正在开发一个在树莓派上运行的开源离线金字塔应用程序,所以我想让一切尽可能简单和高效。该应用程序正在使用 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 将自动提交表单?不是真的,至少不是在我正在使用的系统上(我可以在这个离线应用程序中控制它)。

4

1 回答 1

0

目前尚不清楚您遇到的确切问题是什么,但我认为您不知道如何访问客户端在 POST 请求正文中发送的 JSON dict 中的值,对吧?

答案是request.json_body。这是 Pyramid 文档中的简短教程: 处理 JSON 编码的请求正文该方法只是一个薄包装return json.loads(request.body)

如果您在客户端发送一个 Javascript 对象(正如您似乎正在使用的那样var jsondata = JSON.stringify({var1name: $(#projfld").val(), var2name:...});),在 Python 端您将获得一个 dict. 没有自动为任何变量分配值,它只是一个普通的普通字典:

data = request.json_body 
event.fileprefix = data['fileprefix']
event.eventtype = data['eventtype']

等等。

(另一个不相关的建议:与 Pyramid 教程建议的相反,您不需要那种难看__init__的方法,SQLAlchemy 为您的模型生成一个默认构造函数,它的作用完全相同。只需删除它)

于 2013-03-17T19:45:48.580 回答