接下来我们开发rest接口,这里依然使用Python。
Python版本:2.7.11
Karlooper版本:0.6.1
py-redis版本:2.10.5
一、创建项目:
目录结构如下所示:
.
├── handlers
│ ├── __init__.py
│ └── rest.py
├── index.py
├── README.md
├── settings.py
├── test
│ ├── __init__.py
│ ├── result.json
│ └── test_case.py
├── urls.py
└── utils
├── consts.py
├── decorators.py
└── __init__.py
二、分析项目结构:
handlers目录中放业务逻辑相关代码,
test中放测试用例,
urls.py中是URL映射,
utils中放工具代码,
index.py则是整个app启动的入口。
三、具体代码如下:
handlers/rest.py
# -*- coding: utf-8 -*- import hashlib import json from karlooper.config import get_global_conf from karlooper.web.request import Request from utils.consts import StatusCode from utils.decorators import is_login class BaseHandlers(Request): def before_request(self): self.logger.info(self.get_http_request_message()) def __handle(self): return self._process() def get(self): return self.__handle() def post(self): return self.__handle() def put(self): return self.__handle() def result(self, status, **value): response = { "status": status[0], "msg": status[1], "data": value } return self.response_as_json(response) class Login(BaseHandlers): def _process(self): try: redis = get_global_conf("redis") student_number = self.get_parameter("number") student_password = self.get_parameter("password") students_dict = redis.get("students-dict") students_dict = json.loads(students_dict) if students_dict else {} student = students_dict.get(student_number) if not student: return self.result(StatusCode.NOT_EXIST) pwd = student.get("pwd") md5 = hashlib.md5() md5.update(student_password) student_password = md5.hexdigest() if pwd != student_password: return self.result(StatusCode.PASSWORD_ERROR) token = student.get("token") stu_lg = redis.get("stu-login") stu_lg = json.loads(stu_lg) if stu_lg else [] stu_lg.append(token) stu_lg = json.dumps(stu_lg, ensure_ascii=False) redis.set("stu-login", stu_lg) return self.result(StatusCode.OK, token=token) except Exception, e: self.logger.error("Login error: %s", str(e)) return self.result(StatusCode.ERROR) class StudentInfo(BaseHandlers): @is_login def _process(self): try: redis = get_global_conf("redis") token = self.get_parameter("token", "") result = json.loads(redis.get("stu-" + token)) return self.result(StatusCode.OK, **result) except Exception, e: self.logger.error("get student info error: %s", str(e)) return self.result(StatusCode.ERROR)
utils/consts.py
# -*- coding: utf-8 -*- class StatusCode(object): OK = (0, "OK") ERROR = (1, "SERVER ERROR") NOT_EXIST = (2, "STUDENT NOT EXIST") PASSWORD_ERROR = (3, "PASSWORD ERROR") TOKEN_ERROR = (4, "TOKEN ERROR") NOT_LOGIN = (5, "NOT LOGIN")
utils/decrators.py
# -*- coding: utf-8 -*- import functools import json from consts import StatusCode from karlooper.config import get_global_conf def is_login(method): @functools.wraps(method) def _wrap(self, *args, **kwargs): token = self.get_parameter("token", "") if not token: return self.response_as_json({ "status": StatusCode.TOKEN_ERROR[0], "msg": StatusCode.TOKEN_ERROR[1], "data": {} }) redis = get_global_conf("redis") stu_lg = redis.get("stu-login") stu_lg = json.loads(stu_lg) if stu_lg else [] if token not in stu_lg: return self.response_as_json({ "status": StatusCode.NOT_LOGIN[0], "msg": StatusCode.NOT_LOGIN[1], "data": {} }) return method(self, *args, **kwargs) return _wrap
settings.py
# -*- coding: utf-8 -*- settings = { "log_enable": False, "debug": True } redis_settings = { "host": "localhost", "port": 6379, "db": 1 }
urls.py
# -*- coding: utf-8 -*- from handlers.rest import Login, StudentInfo handlers_mapping = { "/login": Login, "/student-info": StudentInfo }
index.py
# -*- coding: utf-8 -*- from redis import Redis from karlooper.config import set_global_conf from karlooper.web.application import Application from settings import settings, redis_settings from urls import handlers_mapping if __name__ == '__main__': redis = Redis(**redis_settings) set_global_conf("redis", redis) application = Application(handlers=handlers_mapping, settings=settings) application.listen(8888) application.run()
好了,总体上来说,这个工程还是非常符合MVC设计风格的,
工程代码下载地址:点击此处