Уведомления

Группа в Telegram: @pythonsu

#1 Март 15, 2009 13:42:14

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

День добрый, меня зовут Сергей. Третий год пишу веб-приложения на Джаве. Сейчас приболел и решил изучить Пайтон + ГАЕ. За день сбацал простое приложение с 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 и т.д.)
Можно ли делать форвард реквеста, как в Джаве?

Спасибо за помощь!



Офлайн

#2 Март 15, 2009 17:45:41

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

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)
>>>



Офлайн

#3 Март 15, 2009 17:50:11

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

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)
>>>



Офлайн

#4 Март 15, 2009 18:16:29

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

Пробую расковырять 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.

Что делать?



Офлайн

#5 Март 15, 2009 18:24:58

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

serega_sh
В строке
Код:

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

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



Офлайн

#6 Март 15, 2009 18:47:44

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

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 дает такой же результат.
Как к проперте сходить-то?



Отредактировано (Март 15, 2009 18:49:01)

Офлайн

#7 Март 15, 2009 18:54:44

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

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)



Офлайн

#8 Март 15, 2009 18:59:12

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

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('Новость скрыта от просмотра')
означает, что я хочу завести в словаре озвученную пару ключ-значение?



Офлайн

#9 Март 15, 2009 19:01:55

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

serega_sh
TheProperty = property( fget=__GetTheProperty, fset=__SetTheProperty, fdel=__DelTheProperty, doc=“The property description.”)
відступів забагато тому і не бачить ThePrperty (може десь tab нажав?)



Отредактировано (Март 15, 2009 19:04:53)

Офлайн

#10 Март 15, 2009 19:05:34

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

GAE Q and A

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'}
>>>



Отредактировано (Март 15, 2009 19:06:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version