Django+Karlooper+iOS重构学校的学生成绩管理系统(三)服务端rest接口开发

接下来我们开发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设计风格的,

工程代码下载地址:点击此处

Django+Karlooper+iOS重构学校的学生成绩管理系统(四)iOS客户端开发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值