Невозможно выполнить запрос от сущностей, загруженных в хранилище данных ядра приложения - PullRequest
0 голосов
/ 28 октября 2009

Я новичок в питоне. Я не могу сделать запрос из сущностей - UserDetails и телефонной книги, загруженных в хранилище данных ядра приложения. Я написал этот пользовательский интерфейс ниже на основе видео-ролика youtube от Бретта на тему: «Разработка и развертывание приложений в GAE» - приложение для кричания. Что ж, я просто попытался сделать реверс-инжиниринг для запроса из хранилища данных, но на каждом этапе не получилось.

#!/usr/bin/env python

import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
import models

class showPhoneBook(db.Model):
    """ property to store user_name from UI to persist for the session """ 
    user_name = db.StringProperty(required=True)

class MyHandler(webapp.RequestHandler):
    def get(self):
        ## Query to get the user_id using user_name retrieved from UI ##
        p = UserDetails.all().filter('user_name = ', user_name)
        result1 = p.get()
        for itr1 in result1:
            userId = itr.user_id
        ## Query to get the phone book contacts using user_id retrieved ##
        q = PhoneBook.all().filter('user_id = ', userId)
        values = {
            'phoneBookValues': q
        }
        self.request.out.write(
            template.render('phonebook.html', values))
    def post(self):
        phoneBookuser = showPhoneBook(
            user_name = self.request.get('username'))
        phoneBookuser.put()
        self.redirect('/')

def main():
    app = webapp.WSGIApplication([
        (r'.*',MyHandler)], debug=True)
    wsgiref.handlers.CGIHandler().run(app)

if __name__ == "__main__":
    main()

Это мой файл models.py, в котором я определил свои классы UserDetails и PhoneBook,

#!/usr/bin/env python

from google.appengine.ext import db

#Table structure of User Details table
class UserDetails(db.Model):
  user_id = db.IntegerProperty(required = True)
  user_name = db.StringProperty(required = True)
  mobile_number = db.PhoneNumberProperty(required = True)

#Table structure of Phone Book table
class PhoneBook(db.Model):
  contact_id = db.IntegerProperty(required=True)
  user_id = db.IntegerProperty(required=True)
  contact_name = db.StringProperty(required=True)
  contact_number = db.PhoneNumberProperty(required=True)

Вот проблемы, с которыми я сталкиваюсь,
1) Я не могу вызвать user_name (полученный из UI-- phoneBookuser = showPhoneBook(user_name = self.request.get('username'))) в методе get (self) для запроса UserDetails, чтобы получить соответствующий user_name.
2) Код не может распознавать классы UserDetails и PhoneBook при импорте из файла models.py.
3) Я попытался определить классы UserDetails и PhoneBook в самом файле main.py, в них я получаю сообщение об ошибке result1 = p.get(), говоря BadValueError: Unsupported type for property : <class 'google.appengine.ext.db.PropertiedClass'>

Я боролся с 2 неделями, чтобы справиться с беспорядком, в который я попал, но тщетно. Пожалуйста, помогите мне исправить мой код (потому что я чувствую, что я все время пишу код, подверженный ошибкам).

Ответы [ 2 ]

3 голосов
/ 28 октября 2009

Я рекомендую вам прочитать документацию по Python для GAE, найденную здесь .

Некоторые комментарии:

  1. Чтобы использовать свои модели из models.py, вам нужно либо использовать префикс models. (например, models.UserDetails), либо импортировать их, используя

    из моделей импорта *

  2. в MyHandler.get() вы не ищете username получить параметр

  3. Чтобы получить значения, соответствующие запросу, вы делаете p.fetch(1), а не p.get()

  4. Вы также должны прочитать Справочные свойства в GAE . Я рекомендую вам иметь ваши модели как:

    class UserDetails(db.Model):
        user_name = db.StringProperty(required = True)
        mobile_number = db.PhoneNumberProperty(required = True)
    
    #Table structure of Phone Book table
    class PhoneBook(db.Model):
         user = db.ReferenceProperty(UserDetails)
         contact_name = db.StringProperty(required=True)
         contact_number = db.PhoneNumberProperty(required=True)
    

    Тогда ваш MyHandler.get() код будет выглядеть так:

    def get(self):
        ## Query to get the user_id using user_name retrieved from UI ##
        user_name = self.request.get('username')
        p = UserDetails.all().filter('user_name = ', user_name)
        user = p.fetch(1)[0]
        values = {
            'phoneBookValues': user.phonebook_set
        }
        self.response.out.write(template.render('phonebook.html', values))
    

    (Само собой разумеется, вам нужно обработать случай, когда имя пользователя не найдено в базе данных)

  5. Я не совсем понимаю смысл модели showPhoneBook.

1 голос
/ 28 октября 2009

Ваша «переменная сеанса», сохраняемая в хранилище данных, не будет следовать вашему перенаправлению; вам придется извлечь его из хранилища данных в вашем обработчике get (), хотя без установки идентификатора сеанса в файле cookie или чего-то такого, что вообще не будет реализовывать сеансы, а скорее позволять любому получать / использовать любое значение отправить с запросом POST, был ли он отправлен им или кем-то еще. Зачем вообще использовать редирект; Ответ на POST-запрос должен выполняться методом post (), а не путем перенаправления на метод GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...