2010-10-17 2 views
2

Я создал простой проект python, который обслуживает несколько страниц. Я использую фреймворк «webapp» и django. То, что я пытаюсь сделать, это использовать один файл шаблона и загружать «файлы содержимого», содержащие фактический текст на странице.Чтение файлов в GAE с использованием python

Когда я пытаюсь читать файлы содержимого с помощью os.open, я получаю следующее сообщение об ошибке: PageContent = os.open (PAGEURL, 'г') следующим образом() OSError:. [Errno 1] Операция не допускается : 'content_includes/home.inc' error

Если я позволю системе шаблонов django прочитать один и тот же файл для меня, все будет хорошо!

Итак, вопрос в том, что я делаю неправильно, что django не ??? Используется тот же «pageUrl».

Код, приведенный ниже, даст мне ошибку, а если я прокомментирую первое задание на страницеСодержание, все будет хорошо.

Код:

 
     pageName = "home"; 

     pageUrl = os.path.join(os.path.normpath('content_includes'), pageName + '.inc') 
     pageContent = os.open(pageUrl, 'r').read() 
     pageContent=template.render(pageUrl, template_values, debug=True); 

     template_values = { 'page': pageContent, 
          'test': "testing my app" 
          } 

Ошибка:

 
Traceback (most recent call last): 
    File "/opt/apis/google_appengine/google/appengine/ext/webapp/__init__.py", line 511, in __call__ 
    handler.get(*groups) 
    File "/home/odessit/Development/Python/Alpha/main.py", line 19, in get 
    pageContent = os.open(pageUrl, 'r').read() 
    File "/opt/apis/google_appengine/google/appengine/tools/dev_appserver.py", line 805, in FakeOpen 
    raise OSError(errno.EPERM, "Operation not permitted", filename) 
OSError: [Errno 1] Operation not permitted: 'content_includes/home.inc' 

app.yaml:

 
handlers: 
- url: /javascript 
    static_dir: javascript 

- url: /images 
    static_dir: images 

- url: /portfolio 
    static_dir: portfolio 

- url: /.* 
    script: main.py 
+0

btw, template_values ​​был объявлен до назначения pageName – Vladimir

+1

Это ваш фактический код? Поскольку вы назначаете визуализированный шаблон своей переменной сразу после того, как вы пытаетесь его прочитать, и у вас линия с завершающей точкой с запятой. – geoffspear

+0

две вещи: 1. это не мой фактический код, это его фрагмент (я вырезал кучу вещей и заменил их другими вещами), а для template_values ​​он объявлен над именем страницы, так как я не нужны какие-либо замены, которые должны выполняться во время первого рендеринга, а второй рендер находится прямо под объявлением template_values. 2. Мне нравятся точки с запятой - я разработчик Java :) – Vladimir

ответ

2

os.path.normpath() на "content_includes" является не оп - normpath просто удаляет двойные косые и другие денормализации. Вы, вероятно, хотите построить путь относительно сценария, и в этом случае вы должны сделать что-то вроде os.path.join(os.path.dirname(__file__), 'content_includes', pageName + '.inc').

0

Если вы копаете исходный код dev_appserver.py и связанные с ним файлы, вы видите, что сервер выполняет некоторую инкарнационную проверку, чтобы убедиться, что вы открываете только файлы из корневого каталога приложений (на самом деле правила кажутся еще более сложными).

Для проблем с доступом к файлам я измерил код проверки пути на сервере разработки, чтобы найти, что я использую абсолютные пути. Мы, вероятно, должны сделать патч для appengine, чтобы обеспечить лучшую отчетность об ошибках на этом: IIRC the Appserver не отображает оскорбительный путь, но искаженная версия этого, что затрудняет отладку.

Смежные вопросы