刚好我以前学习Python的时候写过一个计算身份证最后校验位的小程序,我何不将其做成一个Web应用呢,使用表单接受输入,计算后将结果通过HTML页面返回给用户。使用GAE(Google App Engine)来发布这个小的Web应用,如何融入框架呢?
相关阅读:开始您的第一个Google App Engine应用
下面是这个web应用所有的代码:
- import cgi
- import wsgiref.handlers
- from google.appengine.api import users
- from google.appengine.ext import webapp
- Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7,9, 10, 5, 8, 4, 2]
- IndexTable = {
- 0 : '1',
- 1 : '0',
- 2 : 'x',
- 3 : '9',
- 4 : '8',
- 5 : '7',
- 6 : '6',
- 7 : '5',
- 8 : '4',
- 9 : '3',
- 10 : '2'
- }
- class Cal():
- def calculate(self, identity):
- No = []
- sum = 0
- No = list(identity)
- for i in range(17):
- sum = sum + (int(No[i]) * Wi[i])
- Index = sum % 11
- return IndexTable[Index]
- class MainPage(webapp.RequestHandler):
- def get(self):
- self.response.out.write("""
- < html>
- < body>
- < form action="/sign" method="post">
- Your card number: < input type="text" name="id">
- < input type="submit" value="Got it">
- < /form>
- < /body>
- < /html>""")
- class Guestbook(webapp.RequestHandler):
- def post(self):
- form = cgi.FieldStorage()
- myid = form['id'].value
- cal = Cal();
- result = cal.calculate(myid);
- self.response.out.write('< html>< body>')
- self.response.out.write(result)
- self.response.out.write('< /body>< /html>')
- def main():
- application = webapp.WSGIApplication(
- [('/', MainPage),
- ('/sign', Guestbook)],
- debug=True)
- wsgiref.handlers.CGIHandler().run(application)
- if __name__ == "__main__":
- main()
这个程序中最关键的代码就是main函数生成webapp.WSGIApplication实例这一句,这个类的构造函数接受了两个参数,其中前面这个list类型的变量为不同的URL注册了各自的handler,如果用户输入的是fuzhijie1985.appspot.com/,那么将触发MainPage.get方法被执行,这个方法生成了一个表单,而表单的action="/sign",因此提交时将触发Guestbook.post方法被执行,在这个方法内将计算身份证的校验位,然后返回给用户一个HTML,内容只有一个字符,那就是校验位。另外需要注意的是Guestbook.get方法是如何从表单输入框中获得身份证号码的,Python CGI的标准方法就是上面代码那样的。
我发现GAE真是太棒了,我不用费任何心思去管这个web应用,它会一直在那儿为用户服务,用户可以通过"http://fuzhijie1985.appspot.com/"使用这个服务,这个应用或许与Google永存吧(Google似乎只提供一个月的试用期,呵呵,一个月后我再看看它还在不在吧)。
发现的几个问题:
1、我开始很讨厌Python语句块的对齐。如果代码有这样的错误,上传时是不会有任何错误的,打开链接时表单都看不到,GAE的程序似乎很不好调试。如果是本地的程序,对齐出现错误,运行时Python解释器会指明错误。
2、不能使用中文。我发现不仅HTML的内容中不能有中文,连中文注释都不能使用,否则下场和上面一样,连表单都看不到。
3、这个程序没有任何保护措施,所以输入的身份证号码如果少于17就会抛出异常,这是因为for循环要执行17次,当少于输入的数字少于17时,比如输入16位时,No[17]就不存在,访问它就要抛异常了。浏览器中可以看到如下内容:
Traceback (most recent call last): File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 509, in __call__ handler.post(*groups) File "/base/data/home/apps/fuzhijie1985/2.335469091362125330/hello.py", line 57, in post result = cal.calculate(myid); File "/base/data/home/apps/fuzhijie1985/2.335469091362125330/hello.py", line 31, in calculate sum = sum + (int(No[i]) * Wi[i])IndexError: list index out of range
【编辑推荐】