0

update 0 我的def post()代码发生了巨大的变化,因为它最初是基于一个数字表单,其中包括复选框和文本输入字段,而不仅仅是文本输入字段,这是当前的设计更像纸。但是,结果我有其他问题可以通过提出的解决方案之一解决,但我不能完全遵循提出的解决方案,所以让我尝试解释新的设计和问题。

较小的问题是我的实现效率低下,因为在def post()我为每个输入时隙创建了一个不同name的长字符串<courtname><timeslotstarthour><timeslotstartminute>。在我的代码中,这name是在嵌套for循环中读取的,带有以下片段[我想效率非常低]。

tempreservation=courtname+str(time[0])+str(time[1])
name = self.request.get('tempreservation',None)

更严重的直接问题是我的def post()代码从未被阅读过,我无法弄清楚为什么(也许以前也没有被阅读过,但我还没有测试那么远)。我想知道问题是否在于现在我希望帖子和获取都以相同的方式“完成”。下面的第一行用于 post(),第二行用于 get()。

return webapp2.redirect("/read/%s" % location_id)
self.render_template('read.html', {'courts': courts,'location': location, ... etc ...}

我的新 post() 如下。请注意,我已经在代码中留下了logging.info,看看我是否曾经到达那里。

class MainPageCourt(BaseHandler):

    def post(self, location_id):
        logging.info("in MainPageCourt post  ")
        startTime = self.request.get('startTime')
        endTime = self.request.get('endTime')
        day = self.request.get('day')
        weekday = self.request.get('weekday')
        nowweekday = self.request.get('nowweekday')
        year = self.request.get('year')
        month = self.request.get('month')
        nowmonth = self.request.get('nowmonth')
        courtnames = self.request.get_all('court')
        for c in courtnames:
            logging.info("courtname: %s " % c)
        times=intervals(startTime,endTime)
        for courtname in courtnames:
            for time in times:
                tempreservation=courtname+str(time[0])+str(time[1])
                name = self.request.get('tempreservation',None)
                if name:
                    iden = courtname
                    court = db.Key.from_path('Locations',location_id,'Courts', iden)
                    reservation = Reservations(parent=court) 
                    reservation.name = name
                    reservation.starttime = time
                    reservation.year = year
                    reservation.nowmonth = int(nowmonth)
                    reservation.day = int(day)
                    reservation.nowweekday = int(nowweekday)
                    reservation.put()
        return webapp2.redirect("/read/%s" % location_id)

最终,我想通过将数据存储中的现有 Reservations 数据与隐含的新预订进行比较,向上述 get() 代码添加检查/验证,并发出警报,告诉用户她可以解决的任何潜在问题。

我也将不胜感激对这两个问题的任何评论。

更新结束 0

我的应用程序适用于社区网球场。我想用模仿纸张的在线数字表替换纸质注册表。两个网球约会发生冲突时,可能会出现“交易性”冲突,这似乎不太可能发生。那么,我如何让第二位约会者提前了解冲突,同时让成功的一方有机会改变她的约会,就像她在纸上(用橡皮擦)一样。

每半小时是表格上的一个时间段。人们通常在“提交”之前一次注册多个半小时。

因此,在循环中的代码中,我执行了 get_all。如果任何获取成功,我想让用户控制是否接受 put()。我仍然认为 put() 将是全有或全无,没有选择性。

所以我的问题是,我是否需要让部分代码使用明确的“事务”?

class MainPageCourt(BaseHandler):

    def post(self, location_id):
        reservations = self.request.get_all('reservations')
        day = self.request.get('day')
        weekday = self.request.get('weekday')
        nowweekday = self.request.get('nowweekday')
        year = self.request.get('year')
        month = self.request.get('month')
        nowmonth = self.request.get('nowmonth')
        if not reservations:
            for r in reservations:
                r=r.split()
                iden = r[0]
                temp = iden+' '+r[1]+' '+r[2]
                court = db.Key.from_path('Locations',location_id,'Courts', iden)
                reservation = Reservations(parent=court) 
                reservation.starttime = [int(r[1]),int(r[2])]
                reservation.year = int(r[3])
                reservation.nowmonth = int(r[4])
                reservation.day = int(r[5])
                reservation.nowweekday = int(nowweekday)
                reservation.name = self.request.get(temp)
                reservation.put()
            return webapp2.redirect("/read/%s" % location_id)
        else:
            ... this important code is not written, pending ...
            return webapp2.redirect("/adjust/%s" % location_id)
4

3 回答 3

1

看看乐观并发控制: http ://en.wikipedia.org/wiki/Optimistic_concurrency_control

于 2012-09-04T18:18:14.227 回答
0

您可以检查给定的时隙的可用性,并仅在它们不冲突时Court编写相应的Reservations子实体。stat_time

以下是使用祖先查询为 1 次预订执行此操作的方法:

@ndb.transactional
def make_reservation(court_id, start_time):
  court = Court(id=court_id)
  existing = Reservation.query(Reservation.start_time == start_time,
                               ancestor=court.key).fetch(2, keys_only=True)
  if len(existing):
    return False, existing[0]
  return True, Reservation(start_time=start_time, parent=court.key).put()

或者,如果您将 slot 设置为 Reservation id 的一部分,则可以删除查询并构造 Reservation 实体键以检查它们是否已存在:

@ndb.transactional
def make_reservations(court_id, slots): 
  court = Court(id=court_id)
  rs = [Reservation(id=s, parent=court.key) for s in slots]
  existing = ndb.get_multi(r.key for r in rs)
  if any(existing):
    return False, existing
  return True, ndb.put_multi(rs)
于 2012-09-05T16:43:48.753 回答
0

我认为您应该始终使用事务,但我认为您的问题最好通过事务来解决。

我认为你应该实施一个两阶段的预订系统——这是你在大多数购物袋和票务公司看到的。

  1. 发布表格会创建一个“预订请求”,它将时间限制为“在别人的购物袋中”5-15 分钟
  2. 用户必须在批准屏幕上再次提交以确认时间。您也可以让他们更新该屏幕上的冲突,并尽可能长时间地重置时间段上的“预订锁定”。
  3. 一个 cronjob - 或一个由在某个窗口进入的请求触发的伪造的 - 清除过期的预留锁并将时间返回到可用插槽池中。
于 2012-09-05T17:20:11.920 回答