基于GAE-Python的主机动态配置

基于GAE-Python的主机动态配置,python,google-app-engine,icalendar,Python,Google App Engine,Icalendar,我正计划开发一款保存事件数据库的应用程序。用户可以查询他们感兴趣的事件(基于地理位置、标签等),并获得指向动态iCal的链接,以便与他们的个人日历同步。将新事件添加到与其查询匹配的数据库时,将更新其日历 这应该使用python托管在GAE上。我已经找到了一个Python模块,它应该能够呈现iCal:的内容 现在我的问题是:如何设置web服务器方面?我知道iCal不是通过http,而是通过webdav协议,但另一方面,webdav是http的扩展,具有向服务器写入操作的额外功能,我的只读日历不需要

我正计划开发一款保存事件数据库的应用程序。用户可以查询他们感兴趣的事件(基于地理位置、标签等),并获得指向动态iCal的链接,以便与他们的个人日历同步。将新事件添加到与其查询匹配的数据库时,将更新其日历

这应该使用python托管在GAE上。我已经找到了一个Python模块,它应该能够呈现iCal:的内容

现在我的问题是:如何设置web服务器方面?我知道iCal不是通过http,而是通过webdav协议,但另一方面,webdav是http的扩展,具有向服务器写入操作的额外功能,我的只读日历不需要这些功能,是吗

问题1:我可以通过http://,使用具有适当mime类型的webapp2托管iCal吗?或者(某些)客户会不接受这一点吗

问题2:如果我需要webdav://协议,从哪里开始?有一些模块可以做webdav,但它们更像是文件服务器(请参阅和,看起来它们也不再维护),这完全不是我需要的。webapp2或其他主流python web框架能否帮助我实现只读iCal?Webapp2帮助对webdav只字未提

谢谢你给我的建议


我在BaseHTTPRequestHandler之上实现了一个简单版本的iCalendar服务器。同样的想法也可以用于GAE。可以使用更复杂的内容渲染器,例如:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

PORT = 8000
DESC = "The long desciption of event. I've tried to keep it serious but at some point"


def limit_to_75_octets(inp):
    if len(inp) <= 73:
        return inp + "\r\n"

    out = ""
    while len(inp) > 73:
        out += inp[:73] + "\r\n"
        inp = " " + inp[73:]

    if len(inp) == 0:
        return out
    else:
        return out + inp + "\r\n"

def render_alarm():
    """creates an alarm 10 minutes before event start"""

    return ("BEGIN:VALARM\r\n" +
        "TRIGGER:-PT10M\r\n" +
        "ACTION:DISPLAY\r\n" +
        limit_to_75_octets("DESCRIPTION:Reminder: %s" % DESC) +
        "END:VALARM\r\n")

def render_event():
    """create and event
    uid: unique event id
    dtstamp: time when event was created
    dtstart: event start time
    dtend: event end time (all dates are in utc)
    """

    return ("BEGIN:VEVENT\r\n" +
        "UID:uid1@example.com\r\n" +
        "DTSTAMP:20141107T200200Z\r\n" +
        "DTSTART:20141109T153000Z\r\n" +
        "DTEND:20141109T163000Z\r\n" +
        limit_to_75_octets("SUMMARY:%s" % DESC) +
        render_alarm() +
        "END:VEVENT\r\n")

def render_calendar():
    return ("BEGIN:VCALENDAR\r\n" +
        "VERSION:2.0\r\n" +
        "PRODID:-//Example Corp.//CalDAV Server//EN\r\n" +
        render_event() +
        "END:VCALENDAR\r\n")


class SharedCalendarServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "text/calendar")
        self.end_headers()

        self.wfile.write(render_calendar())


if __name__ == "__main__":
    try:
        server = HTTPServer(("", PORT), SharedCalendarServer)
        print "Server running on", PORT
        server.serve_forever()

    except KeyboardInterrupt:
        print "Shutting down the web server."
        server.socket.close()
从BaseHTTPServer导入BaseHTTPRequestHandler,HTTPServer
端口=8000
DESC=“事件的详细描述。我试图保持严肃,但在某些时候”
def限制_至_75_八位字节(inp):
如果len(inp)73:
out+=inp[:73]+“\r\n”
inp=”“+inp[73:]
如果len(inp)==0:
返回
其他:
返回+inp+“\r\n”
def渲染_报警():
“”“在事件开始前10分钟创建警报”“”
返回(“开始:VALARM\r\n”+
“触发器:-PT10M\r\n”+
“操作:显示\r\n”+
将字节数限制为75字节(“说明:提醒:%s”%DESC)+
“结束:VALARM\r\n”)
def render_事件():
“”“创建和处理事件”
uid:唯一的事件id
dtstamp:创建事件的时间
dtstart:事件开始时间
dtend:事件结束时间(所有日期均以utc为单位)
"""
返回(“开始:VEVENT\r\n”+
“UID:uid1@example.com\r\n“+
“DTSTAMP:20141107T200200Z\r\n”+
“DTSTART:20141109T153000Z\r\n”+
“数据终端:20141109T163000Z\r\n”+
将字节数限制为75字节(“摘要:%s”%DESC)+
渲染_报警()+
“结束:VEVENT\r\n”)
def render_calendar():
返回(“开始:VCALENDAR\r\n”+
“版本:2.0\r\n”+
“PRODID:-//示例公司//CalDAV服务器//EN\r\n”+
render_事件()+
“结束:VCALENDAR\r\n”)
类SharedCalendarServer(BaseHTTPRequestHandler):
def do_获得(自我):
自我发送_响应(200)
self.send_标题(“内容类型”、“文本/日历”)
self.end_头()
self.wfile.write(render\u calendar())
如果名称=“\uuuuu main\uuuuuuuu”:
尝试:
服务器=HTTPServer((“”,端口),SharedCalendarServer)
打印“服务器正在运行”,端口
服务器。永远为您服务()
除键盘中断外:
打印“关闭web服务器”
server.socket.close()

您找到解决问题的方法了吗