Appengine 创建和导出yaml文件

0 投票
1 回答
1253 浏览
提问于 2025-04-16 05:30

我在创建一个文件并导出为 .yaml 格式时遇到了麻烦。
我正在使用 Python 2.5 的 Google App Engine。
我对 Yaml 文档不太理解,感觉很困惑。

我想做的是创建一个文件并保存它。需要从模型中获取一些实体。

class SaveYAML(webapp.RequestHandler):
    def post(self):
        user = db.Query(models.User)
        user = user.filter('user =', users.get_current_user())
        users = user.fetch(limit = 1)

        for user in users:
            print(user.name, user.adress, user.phone, user.city)

        self.response.headers['Content-Type'] = 'application/yaml'
        self.response.headers['Content-Disposition'] = 'filename = myYaml.yaml' 

通过这段代码,我可以在浏览器中查看,当我点击一个按钮时,可以看到从模型中获取的信息。
可能是因为使用了 print 方法,但它并没有创建一个文件。
而当我把我的应用上传到 Google App Engine 时,显示的信息就不一样了。它只显示了 'Status 200 Ok'。

有人能给我指个方向吗?
我需要导入 pyyaml 库吗?

我把一些代码改成了:

print(yaml.dump(user, sys.stdout))

结果在浏览器中显示是这样的:

- !!binary |
  /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
  HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
  MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAnACgDASIA
  AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
  AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
  ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
  p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
  AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
  BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
  U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
  uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2WxvX
  h8zzNxhEjgk87fmPI9R6+lbKsGUMpBBGQR3rAhKxRTyOyqglck9Mc1nX/iVdGb7JZr9qnlBMcCc7
  T3Psvqeg7elAG7rmv6f4esGu7+ZUXoq5+Zz6Cuc8I+ItS8X6pLqK/wCiaXbKYhbjkyuRnJOOw7Cs
  jXvC8epW0Ta5IdR1O7dTFDG5Eaeirj1xy3oG6dK7rQdGtvDuiQ2FuoCRLl2A+8x5J/OtFKKhtqZu
  MnPfQoajeXDeLtMtICfLG55cNj5Qp6/iVoqLQAb/AMQalqLDKoRBGf1NFceGqOpT9o+t/u6fgdNZ
  csuTt/T/ABMGTVb/AFu4NroW37H5rG5upEOB83AUHr9O/r2roI9DtfDsUt1GHmaTBmmc5kLdBz6d
  sdB246XrcIlpKgXaPNOOBz8wqtqkFxreoRWSKRp0ZJuJM43H+6PXPTPufw6DIytCk/0ttauQv2d8
  rbr3Ck8yKPQ9AP7oB7muk1m+S00We5VgVKfKQeDVe80yO3+eFAIO6gf6v6f7P8vpXP63lfsmnbnM
  c8ykoozhepIrlxk3Gi1Hd6L1ehrQinUV9lr92p0PhezNnoMAcfvJcyv9W5orWhKGFDEQU2jaR0xR
  XRCKhFRjsjOUnJuT6mALmOIyxujHMjE4478d6kXUUXIHnAZ/vH8e9FFUIY2roq8+dn03HH86wYby
  3bxFLduji3twYolxk5IyT196KKTipWv0GpNXsbNv4gtYZ/kEgjY/MpXoe5HP/wCv+ZRRTEf/2Q==
_name: !!python/unicode 'Ana Ferreira'
_parent: null
_parent_key: null
_adress: !!python/unicode 'Porto'
_phone: !!python/unicode '1234569789'
_user: *id002
None
Status: 200 OK
Cache-Control: no-cache
Content-Type: text/yaml
Content-Disposition: filename = myYaml.yaml
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Content-Length: 0

虽然我改了代码,但数据还是只在浏览器中显示。

1 个回答

1

不要用打印功能,应该用 self.response.out.write(...) 来输出。

没错,如果你想输出yaml格式的数据,最好先导入yaml,这样会简单很多。

试试这个:

import yaml

users = model.Users.all().fetch(10)
users = [{'user': {'name': user.name,
                   'address': user.address,
                   'phone': user.phone,
                   'city': user.city}}
          for user in users]

self.response.out.write(yaml.dump(users, default_flow_style=False))

你可以查看一下 yaml文档,里面有关于如何格式化输出的更多信息。

撰写回答