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