Ошибка пустого экрана в Google App Engine

#python #html #google-app-engine #google-cloud-datastore

# #python #HTML #google-app-engine #google-облако-хранилище данных

Вопрос:

Я пробую эту идею, когда на странице «/ search» есть таблица «событий», и когда нажата кнопка «ПЕРЕЙТИ» к событию, она увеличивает количество «RSVP» этого события и перенаправляет обратно на «/ search». Однако, когда я нажал на кнопку «ПЕРЕЙТИ» в своем приложении, это приводит к пустому экрану с URL ‘localhost: 8080 / rsvp’.

Нахожу это странным и задаюсь вопросом, какая часть моего кода неверна. Вот некоторые из соответствующих частей кода, которые, по моему мнению, вызывают ошибку.

Это код из файла python:

 class RSVPItem(webapp2.RequestHandler):
    # increment RSVP count when GO button is clicked
    def post(self):
        itemkey = ndb.Key('Items', self.request.get('itemid'))
        item = itemkey.get()
        item.rsvp = item.rsvp   1
        item.put()
        self.redirect('/search')

# Handler for the Search page
class Search(webapp2.RequestHandler):
    # Display search page
    def get(self):
        user = users.get_current_user()
        if user:  # signed in already
            # Retrieve items
            query = ndb.gql("SELECT * "
                            "FROM Items ")

            template_values = {
                'user_mail': users.get_current_user().email(),
                'logout': users.create_logout_url(self.request.host_url),
                'items': query,
            }
            template = jinja_environment.get_template('search.html')
            self.response.out.write(template.render(template_values))
        else:
            self.redirect(self.request.host_url)

app = webapp2.WSGIApplication([('/', MainPage),
                           ('/giftbook', MainPageUser),
                           ('/wishlist', WishList),
                           ('/deleteitem', DeleteItem),
                           ('/search', Search),
                           ('/rsvp', RSVPItem),
                           ('/display', Display),
                           ('/displaytag', Displaytag)],
                          debug=True)
 

Это из HTML-файла для ‘search.html «. Показывается только та часть, которую я считаю актуальной.

 <h4> Events List </h4>
<table class="table table-bordered table-striped">
    <thead>
    <tr>
        <th width="10%">Name</th>
        <th>Description</th>
        <th width = "10%">Link</th>
        <th width = "10%">Date</th>
        <th width = "10%">Type</th>
        <th width = "10%">RSVP</th>
        <th width = "10%">Rolling?</th>
    </tr>
    </thead>
    <tbody>
    {% for item in items %}
        <tr>
            <td>{{ item.event_name }} </td>
            <td>{{ item.description }}</td>
            <td>{{ item.event_link}}</td>
            <td>{{ item.date.strftime('%Y-%m-%d')  }}</td>
            <td>{{ item.event_type}}</td>
            <td>{{ item.rsvp }}
            <td>
                <form action="/rsvp" method="post">
                    <input type="hidden" name="itemid" value="{{ item.item_id }}">
                    <input type="submit" value="GO!">
                </form></td>
        </tr>
    {% endfor %}
    </tbody>
</table>
 

Ответ №1:

<form action="/rsvp" method="post"> отправляет их /rsvp . У вас есть обработчик URL для /rsvp ?

Убедитесь, что вы привели Key к int :

 itemkey = ndb.Key('Items', int(self.request.get('itemid')))
 

Вместо того, чтобы устанавливать свой собственный идентификатор item_id , просто используйте встроенный Key :

 <input type="hidden" name="itemid" value="{{ item.key.id() }}">
 

Проверьте журналы, чтобы увидеть, есть ли какие-либо ошибки.

Комментарии:

1. о, да, у меня есть. Я отредактирую свой пост и добавлю эту часть своего кода выше.

2. о, в журналах у меня есть это: AttributeError: объект ‘NoneType’ не имеет атрибута ‘rsvp’…. Что это значит??

3. Это означает, что он не нашел соответствия запросу. Убедитесь, что вы привели идентификатор ключа к an int , как я указал в ответе. Он отображается в форме в виде строки, поэтому не может соответствовать Key в запросе.

4. хммм, но я также отредактировал строку кода на ‘itemkey = ndb.Key(‘Items’, int(self.request.get(‘itemid’)))’ и я также установил item_id = ndb. IntegerProperty() . Однако я все равно получил ту же ошибку

5. Подождите. item_id это ваше собственное пользовательское свойство. ndb.Key это ключ хранилища данных. 2 разные вещи. Вы получаете объект Key (лучшим, наиболее эффективным способом). Если вы хотите получить его с помощью item_id , вам нужно запросить его. См. Отредактированный ответ