GAE wiki

主要解决的还是编码问题,需要各种转换

# !/usr/bin/python
# coding : utf-8
# CopyRight 2012 Adou , All Rights Reserved .

import webapp2
from google.appengine.api import users
from google.appengine.ext import db
import urllib
import os
import jinja2

class ViewTimes(db.Model):
    filename = db.StringProperty()
    filepath = db.StringProperty()
    num = db.IntegerProperty(required=True,default=0)

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

def login(func) :
    def wrapper(*args,**kw):
        user = users.get_current_user()
        if not user:
            args[0].redirect(users.create_login_url('/todo/'))
        else :
            return func(*args,**kw)
    return wrapper

def ip2name(ip):
    ip = ip.split('.')
    ip = [int(i) for i in ip]
    ip[0] = chr(ip[0]|128)
    ip[1] = chr(ip[1]|128)
    ip[2] = chr(ip[2]|128)
    ip[3] = chr(ip[3])
    name = (ip[0]+ip[3]+ip[1]+ip[3]+ip[2]+ip[3]).decode('cp936').encode('utf-8')
    return name

class MainPage(webapp2.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if user:
            nickname = user.nickname()
        else :
            #nickname = ip2name(self.request.remote_addr)
            nickname = self.request.remote_addr
        #articles = db.GqlQuery("SELECT * FROM ViewTimes ORDER BY num DESC LIMIT 10")
        content = {
                'username':nickname,
                #'articles':articles,
                }
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(content))


class VimWiki(webapp2.RequestHandler):
    def get(self,path):
        filename = path.decode('utf-8')
        if path.endswith('.html') :
            path = 'vimwiki'+os.sep + path.decode('utf-8').encode('cp936')
        if os.path.exists(path) :
            self.response.out.write(open(path).read().decode('cp936'))
            gps = db.GqlQuery("SELECT * FROM ViewTimes WHERE filename=:1 and filepath=:2 ORDER BY num LIMIT 1" ,filename,'vimwiki'+os.sep)
            db.delete(gps)
            vt = ViewTimes()
            vt.filename = filename
            vt.filepath = 'vimwiki' + os.sep
            vt.num = 1
            for gp in gps :
                vt.num = vt.num + gp.num
            vt.put()
        else :
            self.redirect('/')


class Diary(webapp2.RequestHandler):
    @login
    def get(self,path):
        if path.endswith('.html') :
            path = 'vimwiki'+os.sep+'diary'+os.sep+ path.decode('utf-8').encode('cp936')
        if os.path.exists(path) :
            self.response.out.write(open(path).read().decode('cp936'))
        else :
            self.redirect('/')


class Comment(webapp2.RequestHandler):
    def get(self):
        pass

class Login(webapp2.RequestHandler):
    def get(self) :
        self.redirect(users.create_login_url('/'))

class Logout(webapp2.RequestHandler):
    def get(self) :
        self.redirect(users.create_logout_url('/'))

app = webapp2.WSGIApplication( 
                                [
                                    ('/',MainPage),
                                    ('/vimwiki/(.*)',VimWiki),
                                    #('/vimwiki/diary/(.*)',Diary),
                                    #('/todo/',Todo),
                                    ('/login/',Login),
                                    ('/logout/',Logout),
                                ],
                                debug=True )