2013-03-20 2 views
0

Я начинаю работать в Google App engine и пытаюсь выполнить приложение Google App HelloWorld. redirect url не работает при использовании templates.не удается получить работу с перенаправлением в приложении Google Engine

self.redirect('/?'+urllib.urlencode({'guestbook_name':guestbook_name})) 

перенаправляет но должен показать точный адрес в urlbar как

http://localhost:8080/?guestbook_name=some_name 

, тогда как он показывает, как

http://localhost:8080/?guestbook_name= 

class MainPage(webapp2.RequestHandler): 
    def get(self): 
     guestbook_name=self.request.get('guestbook_name') 
     greetings_query = Greeting.all().ancestor(
      guestbook_key(guestbook_name)).order('-date') 
     greetings = greetings_query.fetch(10) 

     if users.get_current_user(): 
      url = users.create_logout_url(self.request.uri) 
      url_linktext = 'Logout' 
     else: 
      url = users.create_login_url(self.request.uri) 
      url_linktext = 'Login' 

     template_values = { 
      'greetings': greetings, 
      'url': url, 
      'url_linktext': url_linktext, 
     } 

     template = jinja_environment.get_template('index.html') 
     self.response.out.write(template.render(template_values)) 

class Guestbook(webapp2.RequestHandler): 
    def post(self): 

     guestbook_name = self.request.get('guestbook_name') 
     greeting = Greeting(parent=guestbook_key(guestbook_name)) 

     if users.get_current_user(): 
     greeting.author = users.get_current_user().nickname() 

     greeting.content = self.request.get('content') 
     greeting.put() 
     self.redirect('/?' + urllib.urlencode({'guestbook_name': guestbook_name})) 

Index.html файл выглядит как

<html> 
    <body> 
    {% for greeting in greetings %} 
     {% if greeting.author %} 
     <b>{{ greeting.author }}</b> wrote: 
     {% else %} 
     An anonymous person wrote: 
     {% endif %} 
    <blockquote>{{ greeting.content|escape }}</blockquote> 
    {% endfor %} 

<form action="/sign" method="post"> 
    <div><textarea name="content" rows="3" cols="60"></textarea></div> 
    <div><input type="submit" value="Sign Guestbook"></div> 
</form> 

<a href="{{ url }}">{{ url_linktext }}</a> 

    </body> 
</html> 
+0

Что вы подразумеваете под «перенаправлением URL-адреса не работает при использовании шаблонов»? – aschmid00

+0

Я обновил код, я не смог заставить его работать – vaibhav1312

+0

в вашем обновленном вопросе, о вашем вопросе по-прежнему нет. где вы используете 'self.redirect'? где находится часть с 'urllib.urlencode'? – aschmid00

ответ

2

Кажется ваш guestbook_name is '' (emp ty string)

+0

Нет, я его не показывал в браузере – vaibhav1312

1

В вашем index.html нет ввода, который устанавливает имя гостевой книги. Для пустого ключа webapp2 возвращает пустую строку для self.request.get('key_name') вместо None, как вы могли бы ожидать. Вы можете увидеть это, посмотрев на хранилище данных, все ваши сохраненные приветствия будут иметь пустое имя guestbook_name.

Чтобы получить guestbook_name установить свои значения шаблона в методе GET для

template_values = { 
    'greetings': greetings, 
    'guestbook_name': guestbook_name, 
    'url': url, 
    'url_linktext': url_linktext, 
} 

и в вашем index.html

<form action="/sign" method="post"> 
    <div><textarea name="content" rows="3" cols="60"></textarea></div> 
    <div><input type="hidden" name="guestbook_name" value="{{guestbook_name}}"></div> 
    <div><input type="submit" value="Sign Guestbook"></div> 
</form> 

Это добавит guestbook_name в данных, передаваемых в POST, поэтому вы сможете использовать его в своем обработчике.

0

Я столкнулся с подобной проблемой при попытке gae, официальный сайт https://developers.google.com/appengine/docs/python/gettingstartedpython27/templates изменил связанный код, точно так же, как Энтони метен в своем посте. Но вот некоторые проблемы тоже:

  1. В template_values ​​переменной в классе MainPage, guestbook_name был кодируемые urllib.urlencode который утратит, поскольку эта функция принимает Dict или кортеж в качестве переменной , а не строки, URLLIB. Вместо этого следует использовать quote_plus.
  2. Две формы в index.html имеют одну и ту же закодированную переменную guestbook_name, что не очень хорошо, если ваш язык не является английским, и в этом случае в содержимом будет отображаться некоторая строка %2F, поэтому мое решение отправляет дополнительную информацию, закодировано guestbook_name для второй формы.
Смежные вопросы