Python 中的用户输入未写入数据库
User input in Python is not being written to database
只是为了好玩,我正在 Python 中创建一个网站并使用 Google 数据存储创建一个网站,让用户 post 电影标题和评论电影。我也在使用 Jinja2 模板。问题是,movie_name
在所有情况下都会被写入数据库,只有一次除外,它在 class 中表示 MoviePage
。似乎这是唯一没有读取变量 movie_name
的 class,甚至 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)
我的 html 页面中的一小段代码 movie_review_page.html
用于验证 jinja 语法是否正确:
<body>
<h1>{{movie_name}}</h1>
....
我将解释我的代码在做什么。 classes MovieReviews
和 MoviesOnWebsite
只是数据库模型。 class AddMovie
允许用户在没有人提交过对某部电影的评论的情况下将电影添加到数据库中。用户将电影名称添加到数据库后,他们将被重定向到 url,如下所示:www.websitename.com/nameOfMovie
。从那里,class MoviePage
有一个表单,允许用户添加电影标题和评论并将其添加到数据库中。正如我之前提到的问题,当用户在 MoviePage
class 中添加电影片名和评论时,只有评论被写入数据库,而电影片名是空白的。我要写入数据库的片名是用户正在评论的电影,即在url中找到的电影名称。 movie_name
仅写入 class AddMovie
中的数据库。带有电影名称路径的 url 也可以。问题出在MoviePage
class。我应该提到 add-movie.html
有一个名称为 movie_name
的文本框,而 movie_review_page.html
没有。如果我将变量从 movie_name = self.request.get('movie_name')
更改为 movie_name="abcd"
,则 abcd 会写入数据库,但反过来就不行了。
如有任何帮助,我将不胜感激。
我不确定您使用的是什么网络框架,但问题似乎是由查询参数与 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")
只是为了好玩,我正在 Python 中创建一个网站并使用 Google 数据存储创建一个网站,让用户 post 电影标题和评论电影。我也在使用 Jinja2 模板。问题是,movie_name
在所有情况下都会被写入数据库,只有一次除外,它在 class 中表示 MoviePage
。似乎这是唯一没有读取变量 movie_name
的 class,甚至 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)
我的 html 页面中的一小段代码 movie_review_page.html
用于验证 jinja 语法是否正确:
<body>
<h1>{{movie_name}}</h1>
....
我将解释我的代码在做什么。 classes MovieReviews
和 MoviesOnWebsite
只是数据库模型。 class AddMovie
允许用户在没有人提交过对某部电影的评论的情况下将电影添加到数据库中。用户将电影名称添加到数据库后,他们将被重定向到 url,如下所示:www.websitename.com/nameOfMovie
。从那里,class MoviePage
有一个表单,允许用户添加电影标题和评论并将其添加到数据库中。正如我之前提到的问题,当用户在 MoviePage
class 中添加电影片名和评论时,只有评论被写入数据库,而电影片名是空白的。我要写入数据库的片名是用户正在评论的电影,即在url中找到的电影名称。 movie_name
仅写入 class AddMovie
中的数据库。带有电影名称路径的 url 也可以。问题出在MoviePage
class。我应该提到 add-movie.html
有一个名称为 movie_name
的文本框,而 movie_review_page.html
没有。如果我将变量从 movie_name = self.request.get('movie_name')
更改为 movie_name="abcd"
,则 abcd 会写入数据库,但反过来就不行了。
如有任何帮助,我将不胜感激。
我不确定您使用的是什么网络框架,但问题似乎是由查询参数与 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")