一个练习项目,好玩的bbs-python-bottle
代码:
from bottle import route, run, template from bottle import Bottle, request, response import os.path import MySQLdb import json import hashlib import random import math import os from datetime import datetime class DateEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime("%Y-%m-%d %H:%M:%S") else: return json.JSONEncoder.default(self, obj) secretKey = 'saacac3423@21212' pagesize = 20 app = Bottle() def getConn(): conn = MySQLdb.Connection('127.0.0.1', 'root', '123456', 'my_bbs') cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) return (conn, cursor) def getloginuserinfo(sessionId): (conn, cursor) = getConn() try: sessionIdHead = request.cookies.get("sessionId") except: sessionIdHead = '' if sessionIdHead is not None and sessionIdHead != '': sessionId = sessionIdHead sql = "select id,username,nickname,addTime,sessionId from user where sessionId='%s'" % sessionId cursor.execute(sql) data = cursor.fetchone() if data is None: data = {'id' : 0, 'username' : '', 'nickname' : '', 'addTime' : '', 'sessionId' : ''} return data def responsex(code, msg, data): if code != 0: result = {'code' : code, 'msg' : msg, 'data' : None} else: result = {'code' : 0, 'msg' : '', 'data' : data} result = json.dumps(result, cls = DateEncoder, ensure_ascii = False) response.set_header('Server', 'bottle-Web-Framework') return result def error(code, msg): return responsex(code, msg, None) def success( data = {}): return responsex(0, '', data) @app.route('/') def index(): (conn, cursor) = getConn() result = "此站接口使用python.bottle实现,<a href='api.html' target='_blank'>接口列表</a>" response.set_header('Server', 'bottle-Web-Framework') return result @app.route('/user/register') def register(): (conn, cursor) = getConn() username = request.query.username password = request.query.password nickname = request.query.nickname sql = "select id,username,nickname,addTime from user where username='%s'" % username cursor.execute(sql) data = cursor.fetchone() if data != None: return error(1, '用户名已经存在') try: passwordMd5 = hashlib.md5(password.encode(encoding='utf-8')).hexdigest() sql = "insert into user(username, password, nickname) value('%s', '%s', '%s')" % (username, passwordMd5, nickname) cursor.execute(sql) conn.commit() insertId = cursor.lastrowid return success(insertId) except MySQLdb.Error as e: conn.rollback() return error(1, '注册失败') @app.route('/user/login') def login(): (conn, cursor) = getConn() username = request.query.username password = request.query.password passwordMd5 = hashlib.md5(password.encode(encoding='utf-8')).hexdigest() sql = "select id,username,nickname,addTime from user where username='%s' and password='%s'" % (username, passwordMd5) cursor.execute(sql) data = cursor.fetchone() if data == None: return error(1, '用户名或者密码错误') tmpSessionId = secretKey + str(data['id']) + str(data['addTime']) tmpSessionId = hashlib.md5(tmpSessionId.encode(encoding='utf-8')).hexdigest() try: sql = "update user set sessionId='%s' where id=%s" % (tmpSessionId, data['id']) cursor.execute(sql) conn.commit() data['sessionId'] = tmpSessionId return success(data) except MySQLdb.Error as e: conn.rollback() return error(1, '保存会话id失败') @app.route('/user/logout') def logout(): (conn, cursor) = getConn() sessionId = request.query.sessionId data = getloginuserinfo(sessionId) if data == None: return success(None) if data['sessionId'] == '': return success(data) try: sql = "update user set sessionId='' where sessionId='%s'" % sessionId cursor.execute(sql) conn.commit() data['sessionId'] = '' return success(data) except MySQLdb.Error as e: conn.rollback() return error(1, '删除会话id失败') @app.route('/user/getuserinfo') def getuserinfo(): (conn, cursor) = getConn() sessionId = request.query.sessionId userinfo = getloginuserinfo(sessionId) return success(userinfo) @app.route('/post/list') def postlist(): (conn, cursor) = getConn() page = request.query.page keyword = request.query.keyword if page == "": page = 1 page = int(page) if page <= 0: page = 1 addsql = " isDel=0 " if keyword is not None and keyword != '': addsql = " isDel=0 and title like '%"+keyword+"%' " start = (page - 1) * pagesize sql1 = "select count(1) as count from content where %s" % addsql cursor.execute(sql1) countdata = cursor.fetchone() totalpage = math.ceil(countdata['count'] / float(pagesize)) data = [] if totalpage > 0: sql2 = "select id,title,userId,userNickename,replyNum,updateTime from content where %s order by updateTime desc limit %s,%s" % (addsql, start, pagesize) cursor.execute(sql2) data = cursor.fetchall() return success({'totalpage' : totalpage, 'data' : data}) @app.route('/post/detail') def postdetail(): (conn, cursor) = getConn() id = request.query.id sql = "select id,title,content,userId,userNickename,replyNum,updateTime from content where isDel=0 and id=%s" % id cursor.execute(sql) data = cursor.fetchone() return success(data) @app.route('/post/add') def postadd(): (conn, cursor) = getConn() title = request.query.title content = request.query.content sessionId = request.query.sessionId userinfo = getloginuserinfo(sessionId) userId = userinfo['id'] userNickename = userinfo['nickname'] if userId <= 0: return error(1, '请先登录') try: sql = "insert into content(title, content, userId, userNickename) value('%s', '%s', %s, '%s')" % (title, content, userId, userNickename) cursor.execute(sql) conn.commit() insertId = cursor.lastrowid return success(insertId) except MySQLdb.Error as e: conn.rollback() return error(1, '发帖失败') @app.route('/post/edit') def postedit(): (conn, cursor) = getConn() id = request.query.id title = request.query.title content = request.query.content sessionId = request.query.sessionId userinfo = getloginuserinfo(sessionId) userId = userinfo['id'] userNickename = userinfo['nickname'] if userId <= 0: return error(1, '请先登录') try: sql = "update content set title='%s',content='%s',userId=%s,userNickename='%s' where id=%s and userId=%s" % (title, content, userId, userNickename, id, userId) cursor.execute(sql) conn.commit() return success(None) except MySQLdb.Error as e: conn.rollback() return error(1, '编辑帖子失败') @app.route('/post/delete') def postdelete(): (conn, cursor) = getConn() id = request.query.id sessionId = request.query.sessionId userinfo = getloginuserinfo(sessionId) userId = userinfo['id'] userNickename = userinfo['nickname'] if userId <= 0: return error(1, '请先登录') try: sql = "update content set isDel=1 where id=%s and userId=%s" % (id, userId) cursor.execute(sql) conn.commit() return success(None) except MySQLdb.Error as e: conn.rollback() return error(1, '删除帖子失败') @app.route('/reply/list') def replylist(): (conn, cursor) = getConn() page = request.query.page contentId = request.query.contentId if page == "": page = 1 page = int(page) if page <= 0: page = 1 start = (page - 1) * pagesize sql1 = "select count(1) as count from reply where isDel=0 and contentId=%s" % contentId cursor.execute(sql1) countdata = cursor.fetchone() totalpage = math.ceil(countdata['count'] / float(pagesize)) data = [] if totalpage > 0: sql2 = "select id,content,replyUserId,replyUserNickename,addTime from reply where isDel=0 and contentId=%s order by id asc limit %s,%s" % (contentId, start, pagesize) cursor.execute(sql2) data = cursor.fetchall() return success({'totalpage' : totalpage, 'data' : data}) @app.route('/reply/detail') def replydetail(): (conn, cursor) = getConn() id = request.query.id sql = "select id,content,replyUserId,replyUserNickename,addTime from reply where isDel=0 and id=%s" % id cursor.execute(sql) data = cursor.fetchone() return success(data) @app.route('/reply/add') def replyadd(): (conn, cursor) = getConn() contentId = request.query.contentId content = request.query.content sessionId = request.query.sessionId userinfo = getloginuserinfo(sessionId) userId = userinfo['id'] userNickename = userinfo['nickname'] if userId <= 0: return error(1, '请先登录') try: sql2 = "update content set replyNum=replyNum+1 where id=%s" % contentId cursor.execute(sql2) sql1 = "insert into reply(contentId, content, replyUserId, replyUserNickename) value(%s, '%s', %s, '%s')" % (contentId, content, userId, userNickename) cursor.execute(sql1) conn.commit() insertId = cursor.lastrowid return success(insertId) except MySQLdb.Error as e: conn.rollback() return error(1, '回复失败') @app.route('/reply/edit') def replyedit(): (conn, cursor) = getConn() id = request.query.id content = request.query.content sessionId = request.query.sessionId userinfo = getloginuserinfo(sessionId) userId = userinfo['id'] userNickename = userinfo['nickname'] if userId <= 0: return error(1, '请先登录') try: sql = "update reply set content='%s',replyUserId=%s,replyUserNickename='%s' where id=%s and replyUserId=%s" % (content, userId, userNickename, id, userId) cursor.execute(sql) conn.commit() return success(None) except MySQLdb.Error as e: conn.rollback() return error(1, '编辑回复失败') @app.route('/reply/delete') def replydelete(): (conn, cursor) = getConn() id = request.query.id sessionId = request.query.sessionId userinfo = getloginuserinfo(sessionId) userId = userinfo['id'] userNickename = userinfo['nickname'] if userId <= 0: return error(1, '请先登录') sql = "select id,content,replyUserId,replyUserNickename,addTime,contentId from reply where isDel=0 and id=%s" % id cursor.execute(sql) contentdata = cursor.fetchone() if contentdata is None: return error(1, '回复不存在') try: sql2 = "update content set replyNum=replyNum-1 where id=%s" % contentdata['contentId'] cursor.execute(sql2) sql1 = "update reply set isDel=1 where id=%s and replyUserId=%s" % (id, userId) cursor.execute(sql1) conn.commit() return success(None) except MySQLdb.Error as e: conn.rollback() return error(1, '删除回复失败') if __name__ == "__main__": app.run(host='127.0.0.1', port=1091)
输出:
D:\workspace\studys\study_pys\pc_app\dist>D:\software\Python310\python.exe D:\workspace\studys\study_bbs\start_web_bottle.py Bottle v0.12.25 server starting up (using WSGIRefServer())... Listening on http://127.0.0.1:1091/ Hit Ctrl-C to quit.
本文来自博客园,作者:河北大学-徐小波,转载请注明原文链接:https://www.cnblogs.com/xuxiaobo/p/18392593