0

データストア エンティティへのアクセスに問題があります。私はGAEとPythonは初めてなので、親切にしてください。私はオンライン チュートリアルやその他のサンプル コードからコードを調達してきましたが、これまでは順調に進んでいます。

最終的には、電子メールの添付ファイルを削除し、ファイルにいくつかの簡単な変更を加えて、他の .kml ファイル (またはさらに良い .kmz ですが、一度に 1 つずつ :) とマージできるようにしたいと考えています。

ステップ1。アプリのappspotmailアドレスにメールを送信することでした=完了:)

ステップ2。...これはdb.modelに書き込みます=ダッシュボード/データストアビューアでエンティティが存在することを確認できるので、問題ありません=完了:)

step3. - テンプレートをレンダリングして、最新の、たとえば受信した 20 通の電子メールを表示します。このリストは動的に更新されます..... :( うーん

代わりにnone、index.html のすべての変数に対してレンダリングされていることがわかります。おそらく私を正しい方向に向けることができますか?ありがとう!

ダボ

ここにyaml.appがあります

application: racetracer
version: 1
runtime: python27
api_version: 1
threadsafe: false

libraries:                                                                      
- name: jinja2                                                                  
  version: latest   

handlers:
- url: /_ah/mail/.+ 
  script: handle_incoming_email.py
  login: admin

- url: /favicon.ico
  static_files: images/favicon.ico
  upload: images/favicon.ico

- url: /static/css
  static_dir: static/css

- url: /static/html
  static_dir: static/index.html

- url: .*
  script: main.app

inbound_services:
- mail

ここに handle_incoming_email.py があります

import logging, email
import cgi
import datetime
import os.path
import os

from os import path
from google.appengine.ext import webapp 
from google.appengine.ext import db
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext.webapp.template import render
import jinja2
import wsgiref.handlers

from main import *
from baseController import *
from authController import *

class Vault(db.Model):
    #fromAddress= db.UserProperty()
    fromAddress= db.StringProperty()
    subject = db.StringProperty(multiline=True)
    #date = db.DateTimeProperty(auto_now_add=True)
    date = db.StringProperty(multiline=True)
    name = db.StringProperty(multiline=True)

class ProcessEmail(InboundMailHandler): 
    def receive(self, mailMessage): 
        logging.info("Email from: " + mailMessage.sender + " received ok")
        logging.info("Email subject: " + mailMessage.subject )
        logging.info("Email date: " + mailMessage.date )

        fromAddress = mailMessage.sender
        subject = mailMessage.subject
        date = mailMessage.date

        if not hasattr(mailMessage, 'attachments'):
            logging.info("Oi, the email has no attachments")
            # raise ProcessingFailedError('Email had no attached documents')
        else:
            logging.info("Email has %i attachment(s) " % len (mailMessage.attachments))

            for attach in mailMessage.attachments:
                name = attach[0] #this is the file name
                contents = str(attach[1]) #and this is the attached files contents
                logging.info("Attachment name: " + name )
                logging.info("Attachment contents: " + contents)
                vault = Vault()
                vault.fromAddress = fromAddress
                vault.subject = subject
                vault.date = date
                vault.name = name
                vault.contents = contents #.decode() EncodedPayload.decode()
                    vault.put()      

                #f = open("aardvark.txt", "r")
                #blah = f.read(30);
                #logging.info("the examined string is : " + blah)
                #f.close() # Close opened file

app = webapp.WSGIApplication([
  ProcessEmail.mapping()
], debug=True)

def main():
    run_wsgi_app(app)

if __name__ == "__main__":
    main()

ここにbasecontroller.pyがあります

from authController import *
from handle_incoming_email import *
import logging
import os
import webapp2
import jinja2
import wsgiref.handlers

from google.appengine.ext.webapp import template 
from google.appengine.ext import db
from google.appengine.api import users 

TEMPLATE_DIR = os.path.join(os.path.dirname(__file__))
jinja_environment = \
    jinja2.Environment(loader=jinja2.FileSystemLoader(TEMPLATE_DIR))

class Vault(db.Model):
    #fromAddress= db.UserProperty()
    fromAddress= db.StringProperty()
    subject = db.StringProperty(multiline=True)
    #date = db.DateTimeProperty(auto_now_add=True)
    date = db.StringProperty(multiline=True)
    name = db.StringProperty(multiline=True)

class MainPage(webapp2.RequestHandler):    
    def get(self):
        logging.info("this is MainPage in baseController")
        list = db.GqlQuery("SELECT * FROM Vault ORDER BY date DESC").fetch(10)
        logging.info("this is in list: " + str(list))

        vault = Vault()

        fromAddress = vault.fromAddress
        subject = vault.subject
        date = vault.date
        name = vault.name

        values = {
                'fromAddress': fromAddress,
            'subject': subject,
            'date': date,
            'name': name,
            }
        templ = jinja_environment.get_template('index.html')
        self.response.out.write(templ.render(values))                        

def main():
    wsgiref.handlers.CGIHandler().run(app)

if __name__ == "__main__":
  main()

テンプレートのレンダリングは .py で html を使用するよりも優れているとチュートリアルで読みましたが、あまりにも多くのファイルに分割してしまったのではないでしょうか? 彼らの論理は、フロントエンドとバックエンドを別の人が行うというものだったので、今すぐ慣れてください。とにかく、上記は次の index.html にレンダリングすることを意図しています:

index.html

{% extends "base.html" %}
{% block title %} racetracer {% endblock %}
{% block content %}
<h1>Racetracer </h1>
<h3>Files recently received :</h3>
<br>
        <table>
        <tr>
            <th>Email address:                  </th>
            <th>-----------                     </th>
            <th>Subject:                        </th>
            <th>Date Received:                  </th>
            <th>Attachment:                     </th>
        </tr>           
        <tr>                
            <td> {{ fromAddress }}              </td>
            <td> ---------------                </td>   
            <td> {{ subject }}                  </td>
            <td> {{ date }}                     </td>
            <td> {{ name }}                     </td>
        <blockquote>{{ content|escape }}</blockquote>                     
        </p>
        </tr>                               
    </tr>    
    </table>      
<br>

<hr>
<form action="/sign" method="post">
    <textarea name="content" rows="1" cols="20"></textarea>
    <input type="submit" value="Submit (in index:)">
</form>
{% endblock %}

そしてbase.html....

<html><head>
<link type="text/css" rel="stylesheet" href="/static/css/main.css" /></head>

<body> From the file base out in the racetracer folder<br>
right now you are logged in as : 
    {% if user %}
        {{ user.nickname }}!
        [<a href="{{ logout }}"><b>sign out</b></a>]
    {% else %}
        anonymous, who are you?
        [<a href="{{ login }}"><b>sign in</b></a>]
    {% endif %}
    {% block content %}
    {% endblock %}
</body></html>

ここにmain.pyがあります

import os
import webapp2
from handle_incoming_email import *
from baseController import *
from authController import *
from google.appengine.ext.webapp import template 

app = webapp2.WSGIApplication([
    ('/', MainPage),
    #('/ProcessEmail', ProcessEmail),
], debug=True)

def main():
    wsgiref.handlers.CGIHandler().run(app)

if __name__ == "__main__":
  main()

ご協力いただきありがとうございます!それは非常に高く評価されます。

4

1 に答える 1

1

それはNoneであるため、Noneを取得しています。Vault オブジェクトを宣言していますが、それに値を割り当てていません。値は、GQL クエリの結果としてリスト エンティティに含まれます。

vault = Vault() # This creates an empty object (assuming you aren't doing any dynamic init

fromAddress = vault.fromAddress  # Still empty....
subject = vault.subject
date = vault.date
name = vault.name

また、Py 用に予約されているため、list を var として割り当てるべきではありません。

あなたがしたいことは、次のように設定することです:

my_list = YOUR GQL QUERY.fetch()

# Create a formatted list
values = []
for ml in my_list:
    value = {
            'fromAddress': ml.fromAddress,
        'subject': ml.subject,
        'date': ml.date,
        'name': ml.name,
        }

    values.append(value) # You could just append the dictionary directly here, of course

次に、テンプレートパラメーターで値リストを使用します

** アップデート **

GQL クエリは、データストア Vault モデルと比較して適切に見えます。

まず、'list' var を 'my_list' に変更したことを確認してください。次に、取得したオブジェクトの内容を読み取り可能な文字列として出力したい場合は、これをモデルに追加します。

    def __unicode__(self):
       return ('%s %s %s' % (self.key,self.fromAddress,self.subject)) # etc... for the vars you want printed with you print the object

logging.info(my_list) をチェックして、より読みやすいものが出力されるかどうかを確認してください。

そうでない場合は、リストに対して for ループを実行し、キーおよび/または fromAddress をログに記録します。

for vault in my_list:
   logging.info('the key = %s'%vault.key)

それでも何も返されない場合は、開発環境内のインタラクティブ コンソールに直接移動し、そのクエリを実行します。

from google.appengine.ext import db
from *vault_file* import Vault

my_list = db.GqlQuery("SELECT * FROM Vault ORDER BY date DESC").fetch(10) # run query

for vault in my_list:
   print vault.key
   print vault.fromAddress

これらのテストがどこにあるのかをお知らせください。引き続き更新します。

* 更新 #2 *

データストア値の取得を確認できるようになっ
たので、テンプレート ページ パラメータをボールト リストと同じに設定します。

params = dict(values=my_list)
self.response.out.write(templ.render(params)) 

次に、ページで、リストをループして各辞書項目を出力する必要があります。

{% for vault in values %}
    <tr>
       <td>{{vault.fromAddress}}}</td>
       etc...
    </tr>

{% endfor %}

その仕事?

于 2013-03-26T14:46:06.473 に答える