Commit a1f65f08 authored by fangzhipeng's avatar fangzhipeng

提交代码

parent 9f505302
from flask import Flask
from common.error import error_handler, BussinessException
from common.middleware import PrefixMiddleware
from config import config
from daylife.record_service import record
from daylife.user_service import user
from weather.weather_service import weather
from config import config
app = Flask(__name__)
class PrefixMiddleware(object):
def __init__(self, app, prefix=''):
self.app = app
self.prefix = prefix
def __call__(self, environ, start_response):
print(environ['PATH_INFO'])
if environ['PATH_INFO'].startswith(self.prefix):
environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
environ['SCRIPT_NAME'] = self.prefix
return self.app(environ, start_response)
else:
start_response('404', [('Content-Type', 'text/plain')])
return ["This url does not belong to the app.".encode()]
app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/api')
app.register_blueprint(weather)
# app.register_blueprint(weather)
app.register_blueprint(record)
app.register_blueprint(user)
app.register_error_handler(BussinessException, error_handler)
if __name__ == '__main__':
if (not config.isDebug):
app.run(port=9999)
else:
app.run(debug=True)
\ No newline at end of file
app.run(debug=True)
# coding=utf-8
from functools import wraps
import flask
from flask import request
from common import error_type
from common.error import BussinessException
def login_require(func):
@wraps(func)
def decorator(*args, **kwargs):
user_id = request.args.get('user_id')
token = request.args.get('token')
if not user_id or not token:
raise BussinessException(error_type.NEED_LOGIN)
return func(*args, **kwargs)
return decorator
\ No newline at end of file
# coding=utf-8
from common import error_type as et
from util import json_util
def error_handler(exception):
return exception.to_json()
class BussinessException(Exception):
"""
业务异常类
"""
def __init__(self, error_type = et.DEFAUL_ERROR):
self.status = error_type.status
self.message = error_type.message
def to_json(self):
return json_util.to_json(self)
\ No newline at end of file
# coding=utf-8
class ErrorType:
def __init__(self, status, message):
self.status = status
self.message = message
NEED_LOGIN = ErrorType(600, '请登录')
DEFAUL_ERROR = ErrorType(500, '服务器开小差了,请稍后再试')
VERIFY_CODE_EXPIRE = ErrorType(10000001, '验证码过期')
VERIFY_CODE_ERROR = ErrorType(100000002, '验证码错误')
# coding=utf-8
class PrefixMiddleware(object):
def __init__(self, app, prefix=''):
self.app = app
self.prefix = prefix
def __call__(self, environ, start_response):
print(environ['PATH_INFO'])
if environ['PATH_INFO'].startswith(self.prefix):
environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
environ['SCRIPT_NAME'] = self.prefix
return self.app(environ, start_response)
else:
start_response('404', [('Content-Type', 'text/plain')])
return ["This url does not belong to the app.".encode()]
\ No newline at end of file
# coding=utf-8
import redis
r = redis.Redis(host='127.0.0.1')
def put_with_expire(key, value, expire):
"""
redis put 操作
:param key:
:param value:
:param expire: 过期时间毫秒
:return:
"""
r.set(key, value, expire)
def get(key):
"""
获取redis值
:param key:
:return:
"""
value = r.get(key)
if value:
return value.decode(encoding='utf-8')
return None
def delete(key):
"""
删除对应key值
:param key:
:return:
"""
r.delete(key)
if __name__ == '__main__':
put_with_expire('hello_111', 'llljjlkj', 10)
# delete('hello_111')
print(get('hello_111'))
\ No newline at end of file
# -*- coding: utf-8 -*-
import json
import sys
from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
from aliyunsdkdysmsapi.request.v20170525 import QuerySendDetailsRequest
from aliyunsdkcore.client import AcsClient
import uuid
from aliyunsdkcore.profile import region_provider
from aliyunsdkcore.http import method_type as MT
from aliyunsdkcore.http import format_type as FT
from config import config
"""
短信业务调用接口示例,版本号:v20170525
Created on 2017-06-12
"""
try:
reload(sys)
sys.setdefaultencoding('utf8')
except NameError:
pass
except Exception as err:
raise err
# 注意:不要更改
REGION = "cn-hangzhou"
PRODUCT_NAME = "Dysmsapi"
DOMAIN = "dysmsapi.aliyuncs.com"
acs_client = AcsClient(config.get_config('ACCESS_KEY_ID'), config.get_config('ACCESS_KEY_SECRET'), REGION)
region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
def send_sms(business_id, phone_numbers, sign_name, template_code, template_param=None):
smsRequest = SendSmsRequest.SendSmsRequest()
# 申请的短信模板编码,必填
smsRequest.set_TemplateCode(template_code)
# 短信模板变量参数
if template_param is not None:
smsRequest.set_TemplateParam(template_param)
# 设置业务请求流水号,必填。
smsRequest.set_OutId(business_id)
# 短信签名
smsRequest.set_SignName(sign_name)
# 数据提交方式
# smsRequest.set_method(MT.POST)
# 数据提交格式
# smsRequest.set_accept_format(FT.JSON)
# 短信发送的号码列表,必填。
smsRequest.set_PhoneNumbers(phone_numbers)
# 调用短信发送接口,返回json
smsResponse = acs_client.do_action_with_exception(smsRequest)
return json.loads(smsResponse.decode(encoding='utf-8'))
if __name__ == '__main__':
__business_id = uuid.uuid1()
#print(__business_id)
params = "{\"code\":\"12345\",\"product\":\"云通信\"}"
#params = u'{"name":"wqb","code":"12345678","address":"bz","phone":"13000000000"}'
print(send_sms(__business_id, "15071335527", "极客足球", "SMS_102260006", params))
# coding=utf-8
"""
sdk template_code 和自己业务映射关系
"""
verify_code = {'aliyun': {'template_code': 'SMS_102260006', 'sign_name': '极客足球'}}
\ No newline at end of file
# coding=utf-8
import uuid
from common.sms import demo_sms_send, sms_mapping
def send_verify_code(phone, verify_code):
"""
发送短信验证码
:return:
"""
template_code = getattr(sms_mapping, 'verify_code')['aliyun']['template_code']
sign_name = getattr(sms_mapping, 'verify_code')['aliyun']['sign_name']
# {"code": 1234}
params = "{\"code\": " + verify_code + "}"
res = demo_sms_send.send_sms(uuid.uuid1(), phone, sign_name, template_code, params)
if res['Code'] == 'OK':
print('发送成功!')
return 'ok'
else:
print('发送失败')
return 'fail'
if __name__ == '__main__':
send_verify_code('15071335527', '1234')
\ No newline at end of file
#mysql地址
mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4'
\ No newline at end of file
mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4'
#阿里云key
ACCESS_KEY_ID = "LTAItgZHDPJ5Jrdy"
ACCESS_KEY_SECRET = "GC8dDKIfsouOjCbLdiDpjLJaNyexEI"
\ No newline at end of file
# coding=utf-8
mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4'
\ No newline at end of file
mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4'
#阿里云key
ACCESS_KEY_ID = "LTAItgZHDPJ5Jrdy"
ACCESS_KEY_SECRET = "GC8dDKIfsouOjCbLdiDpjLJaNyexEI"
\ No newline at end of file
......@@ -11,7 +11,10 @@ class UserInfo(Base):
__tablename__ = 'user_info'
id = Column(Integer, primary_key=True, nullable=False)
phone = Column(String(20), nullable=False, unique=True)
nickname = Column(String(50), primary_key=True, nullable=False, server_default=text("''"))
create_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
update_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))
class UserRecord(Base):
......@@ -22,3 +25,15 @@ class UserRecord(Base):
content = Column(String(500), nullable=False)
craete_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
update_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))
class UserToken(Base):
__tablename__ = 'user_token'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, nullable=False)
device_type = Column(Integer, nullable=False, server_default=text("'0'"))
token = Column(String(50), nullable=False)
expire_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
create_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
update_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))
# coding=utf-8
"""
session = sqlengin.getSession()
session.commit()
session.close()
"""
from daylife.dao import sqlengin
from daylife.dao.models import UserRecord
def add_record(user_record):
session = sqlengin.getSession()
session.add(user_record)
session.commit()
session.close()
def select_by_user_id(user_id):
session = sqlengin.getSession()
items = session.query(UserRecord).filter(UserRecord.user_id==user_id).order_by(UserRecord.craete_at.desc()).all()
session.close()
return items
\ No newline at end of file
# coding=utf-8
import datetime
import uuid
from daylife.dao import sqlengin
from daylife.dao.models import UserInfo, UserToken
"""
session = sqlengin.getSession()
session.commit()
session.close()
"""
def insert_user(user_info):
session = sqlengin.getSession()
session.add(user_info)
session.commit()
session.close()
def select_by_phone(phone):
session = sqlengin.getSession()
user_info = session.query(UserInfo).filter(UserInfo.phone==phone).first()
session.close()
return user_info
def create_token(user_info):
"""
根据用户信息创建用户token
:param user_info:
:return:
"""
session = sqlengin.getSession()
session.query(UserToken).filter(UserToken.user_id==user_info.id).filter(UserToken.device_type==0).delete()
token = str(uuid.uuid1()).replace('-', '')
expire_at = datetime.datetime.now() + datetime.timedelta(days=90)
user_token = UserToken(user_id=user_info.id, device_type=0, token=token, expire_at=expire_at)
session.add(user_token)
session.commit()
session.close()
return token
# coding=utf-8
class UserInfoVo:
def __init__(self, phone, nickname, id, token):
self.phone = phone
self.nickname = nickname
self.id = id
self.token = token
\ No newline at end of file
# coding: utf-8
from flask import Blueprint
from flask import Blueprint, request
from daylife.dao import sqlengin
from common.decorator import login_require
from common.util import http
from daylife.dao import sqlengin, record_dao
from daylife.dao.models import UserRecord
from util import json_util
record = Blueprint('record', __name__, url_prefix='/record')
@record.route('/my')
@login_require
def get_my_record():
"""
获取个人发布信息
:return:
"""
items = sqlengin.getSession().query(UserRecord).all()
return json_util.db_to_json(items)
user_id = request.args.get('user_id')
items = record_dao.select_by_user_id(user_id)
return http.BaseRes(data=json_util.convert_db_to_json_obj(items)).to_json()
@record.route('/my_follow')
@login_require
def get_my_attention():
"""
我的关注人发布的记录
......@@ -26,13 +31,17 @@ def get_my_attention():
pass
@record.route('/publish')
@login_require
def publish_record():
"""
发布关注信息
:return:
"""
pass
user_id = request.values.get('user_id')
content = request.args.get('content')
user_record = UserRecord(user_id=user_id, content=content)
record_dao.add_record(user_record)
return http.BaseRes(message='发布成功!').to_json()
......
# coding=utf-8
from flask import Blueprint
from flask import Blueprint, request
from common import error_type
from common.decorator import login_require
from common.error import BussinessException
from common.redis import redis_service
from common.sms import sms_service
from common.util import http
from config import config
from daylife.dao import user_dao
from daylife.dao.models import UserInfo
from daylife.model import UserInfoVo
user = Blueprint('user', __name__, url_prefix='/user')
USER_VERIFY_CODE_PREFIX = "verify_code_"
@user.route('/login')
def login():
"""
用户登录
:return:
"""
phone = request.args.get('phone')
verify_code = request.args.get('verify_code')
if config.isDebug:
if phone[0:4] != verify_code:
raise BussinessException(error_type.VERIFY_CODE_ERROR)
else:
check_verify_code(phone, verify_code)
if not user_dao.select_by_phone(phone):
user_dao.insert_user(UserInfo(phone=phone, nickname='黑米包子'))
user_info = user_dao.select_by_phone(phone)
token = user_dao.create_token(user_info)
return http.BaseRes(data=UserInfoVo(user_info.phone, user_info.nickname, user_info.id, token)).to_json()
def check_verify_code(phone, verify_code):
"""
校验用户发来的验证码
:param phone:
:param verify_code:
:return:
"""
verify_code_key = USER_VERIFY_CODE_PREFIX + phone
redis_verify_code = redis_service.get(verify_code_key)
if not redis_verify_code:
raise BussinessException(error_type.VERIFY_CODE_EXPIRE)
if redis_verify_code != verify_code:
raise BussinessException(error_type.VERIFY_CODE_ERROR)
redis_service.delete(verify_code_key)
@user.route('/logout')
def logout():
"""
用户登出
:return:
"""
pass
@user.route('/send_verify_code')
def send_verify_code():
"""
发送验证码
:param phone:
:param verify_code:
:return:
"""
phone = request.args.get('phone')
verify_code = request.args.get('verify_code')
res = sms_service.send_verify_code(phone, verify_code)
if res == 'ok':
redis_service.put_with_expire(USER_VERIFY_CODE_PREFIX + phone, verify_code, 5 * 60)
return http.BaseRes().to_json()
else:
raise BussinessException()
user = Blueprint(name='user', url_prefix='/user')
@user.route('/follow')
@login_require
def follow():
"""
关注
:return:
"""
pass
return '返回关注列表'
@user.route('/fans')
......
#!/usr/bin/env bash
sqlacodegen mysql+pymysql://root:root@127.0.0.1:3306/daylife > ./weather/dao/models.py
\ No newline at end of file
sqlacodegen mysql+pymysql://root:root@127.0.0.1:3306/daylife > ./daylife//dao/models.py
\ No newline at end of file
......@@ -19,4 +19,14 @@ def db_to_json(obj):
:param obj:
:return:
"""
return json.dumps(obj, cls=AlchemyEncoder, ensure_ascii=False)
\ No newline at end of file
return json.dumps(obj, cls=AlchemyEncoder, ensure_ascii=False)
def convert_db_to_json_obj(obj):
"""
把db对象转换为可序列化对象
:param obj:
:return:
"""
return json.loads(db_to_json(obj))
\ No newline at end of file
......@@ -2,7 +2,7 @@ from flask import Blueprint
from flask import request
import requests
import json
from common import BaseRes
from common.util.http import BaseRes
from daylife.dao import sqlengin, models
weather = Blueprint('weather', __name__, url_prefix='/weather')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment