Создание проверки орфографии, необходимо получить доступ к words.txt в App Engine - PullRequest
2 голосов
/ 10 февраля 2012

Я работаю над созданием приложения, в которое пользователь может ввести абзац текста, и я запускаю проверку орфографии для абзаца. Я достаточно легко реализовал это в локальном документе, используя только python, открыв файл 'words.txt', в котором содержится мой словарь. Я пытаюсь понять, как открыть список слов для осуществления проверки орфографии.

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

Вот мои файлы:

app.yaml:

application: *******
version: 1
runtime: python
api_version: 1

handlers:

- url: /(.*\.txt)
  mime_type: text/plain
  static_files: static/\1
  upload: static/(.*\.txt)

- url: /.*
  script: helloworld.py

Выдержки из helloworld.py

import os
from google.appengine.ext.webapp import template
import cgi
import datetime
import urllib
import wsgiref.handlers
from google.appengine.api import urlfetch 

from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

....

result=urlfetch.fetch(os.path.join(os.path.dirname(__file__),'words.txt'))
words=set(result.splitlines())

Что не так? Я продолжаю получать сообщение об ошибке.

Ответы [ 4 ]

2 голосов
/ 05 декабря 2012

У вас тут куча разных подходов к доступу к файлам. Когда вы делаете:

result=urlfetch.fetch(os.path.join(os.path.dirname(__file__),'words.txt'))

путь, который вы создаете для 'words.txt', будет правильным путем для файла, который вы загрузили в тот же каталог, что и скрипт-обработчик, если вы не объявили его частью статических_файлов, хотя он и отображается из вашей конфигурации, что вы хотите, чтобы путь был больше похож на:

os.path.join(os.path.dirname(__file__), 'static', 'words.txt')

Однако у вас есть две проблемы здесь. Во-первых, static_files передаются из процесса, отличного от вашего обработчика, и (могут) загружаться на совершенно другой сервер. У вас не будет доступа к файловой системе (я полагаю, именно поэтому вы используете urlfetch.) Путь, который вы создаете, предназначен для доступа к файловой системе, а не для доступа к urlfetch. Чтобы использовать urlfetch в рабочей среде, вам нужно будет использовать сетевой URL-адрес, как предлагает @brianmichelich, однако имейте в виду, что это не будет работать при использовании сервера разработки, который может обрабатывать только один запрос за раз.

Однако, если вы удалите статические директивы из вашего app.yaml, вы сможете использовать этот путь как часть обычного блока with / open.

2 голосов
/ 10 февраля 2012

Вы не можете получить доступ к файлам, которые вы определили как статические в app.yaml из вашего кода. Вместо этого либо удалите статическое отображение, либо включите другую копию в свой код. Затем вы можете получить доступ к файлу, используя что-то вроде:

f = open('words.txt')
words = f.read()
f.close()
0 голосов
/ 10 февраля 2012

Вы можете поместить локальные файлы в Google App Engine и открыть их для чтения.
Если ваш файл находится на верхнем уровне, вам нужно сделать что-то вроде этого:

f = open('./words.txt')

Вам не нужно извлекать файл, используя urlfetch.

0 голосов
/ 10 февраля 2012

Вы должны получить полностью определенный URL, например, http://myapp.appspot.com/words.txt

from google.appengine.api import urlfetch, app_identity

url = 'http://%s/words.txt' % app_identity.get_default_version_hostname()
result=urlfetch.fetch(url)
words=result.content
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...