Найти - Пользователи
Полная версия: GAE Q and A
Начало » Google App Engine » GAE Q and A
1 2
serega_sh
День добрый, меня зовут Сергей. Третий год пишу веб-приложения на Джаве. Сейчас приболел и решил изучить Пайтон + ГАЕ. За день сбацал простое приложение с CRUD'ом, возник ряд вопросов.

У меня вопрос такой:
Есть вьюха (Django template). Но вьюхе юзер просматривает список новостей, может их скрывать, редактировать и создавать новые.

Этот хандлер готовит данные для вьюхи, выгружает список новостей.
#prepare view data, show news
class AdminPage(webapp.RequestHandler):
def get(self):
message = self.request.get('message')
if not message:
message = 'You are in admin console.'
logging.debug("Did message came -> " + message);
offset = self.request.get('offset')
limit = self.request.get('limit')
news = get_news(offset, limit, False)
values = {
'page': 'admin',
'news': news,
'count': get_news_count(),
'message': message
}
path = os.path.join(os.path.dirname(__file__),'html/admin.html')
self.response.out.write( template.render(path, values) )
Этот хандлер получает ключ новости, меняет значение атрибута новости ( hide_news( key ) )… и должен форварднуть обработку реквеста хандлеру AdminPage
Но у меня не получается это сделать.
Как же передать message в ханделер AdminPage?
class HideNews(webapp.RequestHandler):
def get(self):
key = self.request.get('key')
logging.debug("hide news with key["+key+"]")
hide_news( key )
values = {
'message':'News was hidden'
}
self.redirect("/admin")
P.S
Я пробовал следующую штуку:
class HideNews(webapp.RequestHandler):
def get(self):
key = self.request.get('key')
logging.debug("hide news with key["+key+"]")
hide_news( key )
message = "Новость скрыта".decode('utf-8')
url = "/admin?message=".decode('utf-8')+message
self.redirect(url)
получаю исключение:
self.response.headers = str(absolute_url)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position
36-42: ordinal not in range(128)

WTF? Я что, не могу utf-8 строку передать в кач-ве параметра у редирект урла?
Кстати, если значение message задавать латиницей, то все работает отлично.
message = “OLOLO news has been hidden”.decode('utf-8') - работает без исключений.

Есть ли форвард в ГАЕ? Можно ли организовать аналог Action (RequestHandler) chaning по аналогии с фреймворками в Джаве (Struts и т.д.)
Можно ли делать форвард реквеста, как в Джаве?

Спасибо за помощь!
crchemist
serega_sh
получаю исключение:
self.response.headers = str(absolute_url)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position
36-42: ordinal not in range(128)

WTF? Я что, не могу utf-8 строку передать в кач-ве параметра у редирект урла?
Помилка виникає не при присвоєнні а в str:
>>> a = u'абракадабра'
>>> b = str(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-10: ordinal not in range(128)
>>>
crchemist
serega_sh
Кстати, если значение message задавать латиницей, то все работает отлично.
message = “OLOLO news has been hidden”.decode('utf-8') - работает без исключений.
>>> message = "OLOLO news has been hidden".decode('utf-8')
>>> url = "/admin?message=".decode('utf-8')+message
>>> str(url)
'/admin?message=OLOLO news has been hidden'
>>>
>>>
>>>
>>> message = "Новость скрыта".decode('utf-8')
>>> url = "/admin?message=".decode('utf-8')+message
>>> str(url)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-21: ordinal not in range(128)
>>>
serega_sh
Пробую расковырять request:
class HideNews(webapp.RequestHandler):
def get(self):
if isAdminUser( users.get_current_user() ):
key = self.request.get('key')
hide_news( key )
adminPage = AdminPage()
#self.request.GET.items().append( Item('message','Новость спрятана от просмотра'.decode('utf-8')) )
self.request.params.update( message='ololo')
adminPage.initialize(self.request, self.response)
adminPage.get()
В строке
self.request.GET.items().append( Item('message','Новость спрятана от просмотра'.decode('utf-8')) )
Я не могу понять, какой тип нужно запихивать в список.

Попытка записать в мапу/словарь
self.request.params.update( message='ololo')
так же не увенчалась успехом, словарь в реквесте - readOnly.

Что делать?
crchemist
serega_sh
В строке
Код:

self.request.GET.items().append( Item('message','Новость спрятана от просмотра'.decode('utf-8')) )

Я не могу понять, какой тип нужно запихивать в список.
попробуй так
self.request.GET['message'] = 'Новость спрятана от просмотра'.decode('utf-8')
serega_sh
crchemist
serega_sh
В строке
Код:

self.request.GET.items().append( Item('message','Новость спрятана от просмотра'.decode('utf-8')) )

Я не могу понять, какой тип нужно запихивать в список.
попробуй так
self.request.GET['message'] = 'Новость спрятана от просмотра'.decode('utf-8')
Так он же мне вроде None должен слева вернуть, сейчас попробую. Еще вопрос, нашел такую статейку про Пайтон:
http://www.geocities.com/foetsch/python/new_style_classes.htm

Пытаюсь прикрепить к хэндлеру пропертю, в которую другие хэндлеры смогут записывать данные, чтобы центровой хэндлер (AdminPage) мог все отрисовывать за них.
Есть такой код:

class AdminPage(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if isAdminUser( users.get_current_user() ):
logging.debug("self.msg -> " + self.__m_the_property );
message = self.request.get('message')
if not message:
message = 'Вы находитесь в кубрике Администратора.'

offset = self.request.get('offset')
limit = self.request.get('limit')
news = get_news(offset, limit, False)
values = {
'page': 'admin',
'news': news,
'count': get_news_count(),
'message': message,
'nickname' : user.nickname(),
'logoutUrl' : users.create_logout_url("/admin")

}
path = os.path.join(os.path.dirname(__file__),'html/admin.html')
else:
values = {
'loginUrl' : users.create_login_url("/")
}
path = os.path.join(os.path.dirname(__file__),'html/error.html')
self.response.out.write( template.render(path, values) )

def __SetTheProperty(self, value):
self.__m_the_property = value

def __GetTheProperty(self):
return self.__m_the_property

def __DelTheProperty(self):
del self.__m_the_property

TheProperty = property( fget=__GetTheProperty,
fset=__SetTheProperty,
fdel=__DelTheProperty,
doc="The property description.")

def __GetReadOnlyProperty(self):
return "This is a calculated value."
Не получается в строке
logging.debug("self.msg -> " + self.__m_the_property );
обратиться к своей проперте:
AttributeError: ‘AdminPage’ object has no attribute ‘_AdminPage__m_the_property’

self.TheProperty дает такой же результат.
Как к проперте сходить-то?
serega_sh
crchemist
serega_sh
В строке
Код:

self.request.GET.items().append( Item('message','Новость спрятана от просмотра'.decode('utf-8')) )

Я не могу понять, какой тип нужно запихивать в список.
попробуй так
self.request.GET['message'] = 'Новость спрятана от просмотра'.decode('utf-8')
Сработало, но не хочет кушать кириллицу. Латиница проходит.

message = self.request.get('message')
File “M:\Google\google_appengine\lib\webob\webob\multidict.py”, line 296, in _decode_value
value = value.decode(self.encoding, self.errors)
File “M:\Python252\lib\encodings\utf_8.py”, line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-6: ordinal not in range(128)
serega_sh
crchemist
serega_sh
получаю исключение:
self.response.headers = str(absolute_url)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position
36-42: ordinal not in range(128)

WTF? Я что, не могу utf-8 строку передать в кач-ве параметра у редирект урла?
Помилка виникає не при присвоєнні а в str:
>>> a = u'абракадабра'
>>> b = str(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-10: ordinal not in range(128)
>>>
self.request.GET['message'] = str('Новость скрыта от просмотра')
Позволяет кириллицей дописать параметр реквеста. Пришлось родственников привлекать, я по-украински плохо читаю.
Большое спасибо, кажись, работает!

Я только не понял вот чего:
self.request.GET - если у меня в словаре нет ключа ‘message’, мне что, None никогда не вернется? Или Пайтон сам рюхает, что
self.request.GET = str('Новость скрыта от просмотра')
означает, что я хочу завести в словаре озвученную пару ключ-значение?
crchemist
serega_sh
TheProperty = property( fget=__GetTheProperty, fset=__SetTheProperty, fdel=__DelTheProperty, doc=“The property description.”)
відступів забагато тому і не бачить ThePrperty (може десь tab нажав?)
crchemist
serega_sh
Я только не понял вот чего:
self.request.GET - если у меня в словаре нет ключа ‘message’, мне что, None никогда не вернется? Или Пайтон сам рюхает, что
self.request.GET = str('Новость скрыта от просмотра')
означает, что я хочу завести в словаре озвученную пару ключ-значение?
>>> a = {}
>>> a['message']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'message'
>>> a.get('message')
>>> a.get('message', 'Hello')
'Hello'
>>> a
{}
>>> a['message'] = 'hello world'
>>> a
{'message': 'hello world'}
>>> a.setdefault('message', 'hi')
'hello world'
>>> a.setdefault('message2', 'hi')
'hi'
>>> a
{'message': 'hello world', 'message2': 'hi'}
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB