【问题标题】:User input in Python is not being written to databasePython 中的用户输入未写入数据库
【发布时间】:2015-09-10 14:19:38
【问题描述】:

只是为了好玩,我正在用 Python 创建一个网站,并使用 Google 数据存储创建一个网站,让用户可以发布电影标题和电影评论。我也在使用 Jinja2 模板。问题是,movie_name 在所有情况下都被写入数据库,除了一个,它是在说MoviePage 的类中。似乎这是唯一没有读取变量 movie_name 的类,甚至 jinja 模板也没有读取该变量。但是,我的 html 中有其他变量正在由 jinja2 解析,这只是我遇到问题的一个变量。这是我的代码:

    class MovieReviews(db.Model):
      movie_name = db.StringProperty()
      review = db.TextProperty(required = True)
      created = db.DateTimeProperty(auto_now_add = True)
      last_modified = db.DateTimeProperty(auto_now = True)

    class MoviesOnWebsite(db.Model):
      movie_name = db.StringProperty(required = True)
      created = db.DateTimeProperty(auto_now_add= True)



   class AddMovie(StrHandler):
      def get_front(self,movie_name="",error=""):
        add_movie = db.GqlQuery("SELECT * FROM MoviesOnWebsite")
        self.render("add-movie.html",movie_name=movie_name,error=error,add_movie=add_movie)

      def get(self):
        self.get_front()

      def post(self):
        haveError = False
        movie_name = self.request.get("movie_name")

        params = dict(movie_name=movie_name)

        if not movie_name:
          params['error_movie_name'] = "Must write movie name"
          haveError = True
        if haveError:
          self.render("add-movie.html", **params)
          self.response.out.write('You have errors')
        else:
          addmovie = MoviesOnWebsite(movie_name=movie_name)
          addmovie.put()
          site_url = urllib.urlencode(dict(movie_name=movie_name))
          self.redirect('/' + site_url)

    class MoviePage(StrHandler):
      def get_front(self, review="",error=""):
        addmovie = AddMovie()
        full_url = addmovie.site_url
        movie_reviews = db.GqlQuery("SELECT * FROM MovieReviews")
        self.render("movie_review_page.html", review=review,error=error,movie_reviews=movie_reviews)

      def get(self,url):
        self.get_front()

      def post(self,url):
        path = urlparse.urlparse(full_url).path
        movie_name = self.request.get('movie_name')
        review = self.request.get("review")

      if review:
        movie_rev = MovieReviews(path = path,review = review)
        movie_rev.put()

      else:
        error = "You haven't submitted a review"
        self.get_front(review,error)

还有一个小代码 sn-p 从我的 html 页面调用movie_review_page.html 来验证 jinja 语法是否正确:

<body>
  <h1>{{movie_name}}</h1>
....

我将解释我的代码在做什么。 MovieReviews 和 MoviesOnWebsite 类只是数据库模型。 AddMovie 类允许用户在没有人为该特定电影提交评论的情况下将电影添加到数据库中。用户将电影名称添加到数据库后,他们会被重定向到如下所示的 url:www.websitename.com/nameOfMovie。从那里,MoviePage 类有一个表单,允许用户添加电影标题和评论并将其添加到数据库中。正如我之前提到的问题,当用户在MoviePage 类中添加电影标题和评论时,只有评论被写入数据库并且电影标题为空白。我要写入数据库的电影标题是用户正在评论的电影,即在 url 中找到的电影的名称。 movie_name 只会写入AddMovie 类中的数据库。带有电影名称的路径的 url 也可以使用。问题出在MoviePage 类中。我应该提到add-movie.html 有一个名为movie_name 的文本框,而movie_review_page.html 没有。如果我将变量从 movie_name = self.request.get('movie_name') 更改为 movie_name="abcd",那么 abcd 会被写入数据库,但反过来就不行了。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 您使用的是哪个网络框架?

标签: python python-2.7 google-app-engine jinja2 google-cloud-datastore


【解决方案1】:

我不确定您使用的是什么网络框架,但问题似乎是由查询参数与 url 参数引起的。

其他值包含在表单中,因此从 self.request.get。对于movie_name,您不能使用相同的调用,您需要以某种方式从当前url 中提取它,但是如果您的电影中有非标准字符或空格,这将导致问题。

而是 url 对参数进行编码并将其包含在重定向中:

将重定向更改为:

import urllib
self.redirect('/?' + urllib.urlencode(dict(movie_name=movie_name))

生成的 url 应该类似于 /?movie_name=The%20Terminator

然后像这样检索数据:

self.request.get("movie_name")

【讨论】:

  • 嗨,Anarci,感谢您的评论。我正在使用 webapp2 框架。我的那部分代码如下所示:app = webapp2.WSGIApplication([('/([a-zA-Z]|[0-9]|[$-_@.&amp;+])+', MoviePage)], debug = True)。我在路径后面有一个正则表达式模式,可以接收任何可能由字母、数字或符号组合而成的电影名称。
  • 我明白了,我用一些你可以尝试的代码更新了答案
  • 我使用提供的 urllib 将我使用的 self.redirect 替换为重定向,但出现服务器错误。
  • 它表示class MoviePage 的语法无效。我没有编辑那部分代码。我只在AddMovie 类的最后一行添加了新的self.redirect。
  • 它很可能是缩进问题。你能创建一个新代码的要点吗?
猜你喜欢
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多