首页 > 编程语言 >一个练习项目,好玩的bbs-python-webpy

一个练习项目,好玩的bbs-python-webpy

时间:2024-09-02 14:03:15浏览次数:5  
标签:return python bbs self cursor sessionId data id webpy

代码:

import web
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)

urls = (
    '/', 'indexHandler',
    '/user/register', 'RegisterHandler',
    '/user/login', 'LoginHandler',
    '/user/logout', 'LogoutHandler',
    '/user/getuserinfo', 'GetuserinfoHandler',
    '/post/list', 'PostlistHandler',
    '/post/detail', 'PostdetailHandler',
    '/post/add', 'PostaddHandler',
    '/post/edit', 'PosteditHandler',
    '/post/delete', 'PostdeleteHandler',
    '/reply/list', 'ReplylistHandler',
    '/reply/detail', 'ReplydetailHandler',
    '/reply/add', 'ReplyaddHandler',
    '/reply/edit', 'ReplyeditHandler',
    '/reply/delete', 'ReplydeleteHandler'
)

class BaseHandler:
    conn = None
    cursor = None
    secretKey = 'saacac3423@21212'
    pagesize = 20
    
    def __init__(self):
        self.conn = MySQLdb.Connection('127.0.0.1', 'root', '123456', 'my_bbs')
        self.cursor = self.conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
        
    def __del__(self):
        self.cursor.close()
        self.conn.close()
        
    def get_argument(self, name, default = ''):
        i = web.input()
        if name in i:
            if name == "id":
                return i.id
            elif name == "sessionId":
                return i.sessionId
            elif name == "page":
                return i.page
            elif name == "keyword":
                return i.keyword
            elif name == "username":
                return i.username
            elif name == "password":
                return i.password
            elif name == "nickname":
                return i.nickname
            elif name == "title":
                return i.title
            elif name == "content":
                return i.content
            elif name == "contentId":
                return i.contentId
        else:
            return default
 
    def getloginuserinfo(self, sessionId):
        try:
            sessionIdHead = self.get_secure_cookie("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
        self.cursor.execute(sql)
        data = self.cursor.fetchone()
        if data is None:
            data = {'id' : 0, 'username' : '', 'nickname' : '', 'addTime' : '', 'sessionId' : ''}
        
        return data
        
    def response(self, 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)
        web.header('Content-Type', 'text/plain; charset=utf-8')
        web.header('Server', 'webpy-Framework')
            
        return result
    
    def error(self, code, msg):
        return self.response(code, msg, None)
    
    def success(self, data = {}):
        return self.response(0, '', data)

class indexHandler(BaseHandler):
    def GET(self):
        web.header('Content-Type', 'text/plain; charset=utf-8')
        web.header('Server', 'webpy-Framework')
        return "此站接口使用python.webpy实现,<a href='api.html' target='_blank'>接口列表</a>"
    
class RegisterHandler(BaseHandler):
    def GET(self):
        username = self.get_argument("username", "")
        password = self.get_argument("password", "")
        nickname = self.get_argument("nickname", "")
        sql = "select id,username,nickname,addTime from user where username='%s'" % username
        self.cursor.execute(sql)
        data = self.cursor.fetchone()
        if data != None:
            return self.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)
            self.cursor.execute(sql)
            self.conn.commit()
            insertId = self.cursor.lastrowid
            return self.success(insertId)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '注册失败')
            
class LoginHandler(BaseHandler):
    def GET(self):
        username = self.get_argument("username", "")
        password = self.get_argument("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)
        self.cursor.execute(sql)
        data = self.cursor.fetchone()
        if data == None:
            return self.error(1, '用户名或者密码错误')

        tmpSessionId = self.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'])
            self.cursor.execute(sql)
            self.conn.commit()
            data['sessionId'] = tmpSessionId
            return self.success(data)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '保存会话id失败')
            
class LogoutHandler(BaseHandler):
    def GET(self):
        sessionId = self.get_argument("sessionId", "")
        data = super().getloginuserinfo(sessionId)
        
        if data == None:
            return self.success(None)
        
        if data['sessionId'] == '':
            return self.success(data)

        try:
            sql = "update user set sessionId='' where sessionId='%s'" % sessionId
            self.cursor.execute(sql)
            self.conn.commit()
            data['sessionId'] = ''
            return self.success(data)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '删除会话id失败')
        
class GetuserinfoHandler(BaseHandler):
    def GET(self):
        sessionId = self.get_argument("sessionId", "")
        userinfo = super().getloginuserinfo(sessionId)
        return self.success(userinfo)
        
class PostlistHandler(BaseHandler):
    def GET(self):
        page = self.get_argument("page", "1")
        keyword = self.get_argument("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) * self.pagesize
        
        sql1 = "select count(1) as count from content where %s" % addsql
        self.cursor.execute(sql1)
        countdata = self.cursor.fetchone()
        totalpage = math.ceil(countdata['count'] / float(self.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, self.pagesize)
            self.cursor.execute(sql2)
            data = self.cursor.fetchall()
        
        return self.success({'totalpage' : totalpage, 'data' : data})
        
class PostdetailHandler(BaseHandler):
    def GET(self):
        id = self.get_argument("id", "0")
        sql = "select id,title,content,userId,userNickename,replyNum,updateTime from content where isDel=0 and id=%s" % id
        self.cursor.execute(sql)
        data = self.cursor.fetchone()
        
        return self.success(data)
        
class PostaddHandler(BaseHandler):
    def GET(self):
        title = self.get_argument("title", "")
        content = self.get_argument("content", "")
        sessionId = self.get_argument("sessionId", "")
        userinfo = super().getloginuserinfo(sessionId)
        userId = userinfo['id']
        userNickename = userinfo['nickname']
        
        if userId <= 0:
            return self.error(1, '请先登录')

        try:
            sql = "insert into content(title, content, userId, userNickename) value('%s', '%s', %s, '%s')" % (title, content, userId, userNickename)
            self.cursor.execute(sql)
            self.conn.commit()
            insertId = self.cursor.lastrowid
            return self.success(insertId)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '发帖失败')
        
class PosteditHandler(BaseHandler):
    def GET(self):
        id = self.get_argument("id", "0")
        title = self.get_argument("title", "")
        content = self.get_argument("content", "")
        sessionId = self.get_argument("sessionId", "")
        userinfo = super().getloginuserinfo(sessionId)
        userId = userinfo['id']
        userNickename = userinfo['nickname']
        
        if userId <= 0:
            return self.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)
            self.cursor.execute(sql)
            self.conn.commit()
            return self.success(None)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '编辑帖子失败')
        
class PostdeleteHandler(BaseHandler):
    def GET(self):
        id = self.get_argument("id", "0")
        sessionId = self.get_argument("sessionId", "")
        userinfo = super().getloginuserinfo(sessionId)
        userId = userinfo['id']
        userNickename = userinfo['nickname']
        
        if userId <= 0:
            return self.error(1, '请先登录')

        try:
            sql = "update content set isDel=1 where id=%s and userId=%s" % (id, userId)
            self.cursor.execute(sql)
            self.conn.commit()
            return self.success(None)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '删除帖子失败')
        
class ReplylistHandler(BaseHandler):
    def GET(self):
        page = self.get_argument("page", "1")
        contentId = self.get_argument("contentId", "0")
        if page == "":
            page = 1
        page = int(page)
        if page <= 0:
            page = 1
        start = (page - 1) * self.pagesize
        
        sql1 = "select count(1) as count from reply where isDel=0 and contentId=%s" % contentId
        self.cursor.execute(sql1)
        countdata = self.cursor.fetchone()
        totalpage = math.ceil(countdata['count'] / float(self.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, self.pagesize)
            self.cursor.execute(sql2)
            data = self.cursor.fetchall()
        
        return self.success({'totalpage' : totalpage, 'data' : data})
        
class ReplydetailHandler(BaseHandler):
    def GET(self):
        id = self.get_argument("id", "0")
        sql = "select id,content,replyUserId,replyUserNickename,addTime from reply where isDel=0 and id=%s" % id
        self.cursor.execute(sql)
        data = self.cursor.fetchone()
        
        return self.success(data)
        
class ReplyaddHandler(BaseHandler):
    def GET(self):
        contentId = self.get_argument("contentId", "0")
        content = self.get_argument("content", "")
        sessionId = self.get_argument("sessionId", "")
        userinfo = super().getloginuserinfo(sessionId)
        userId = userinfo['id']
        userNickename = userinfo['nickname']
        
        if userId <= 0:
            return self.error(1, '请先登录')

        try:
            sql2 = "update content set replyNum=replyNum+1 where id=%s" % contentId
            self.cursor.execute(sql2)
            sql1 = "insert into reply(contentId, content, replyUserId, replyUserNickename) value(%s, '%s', %s, '%s')" % (contentId, content, userId, userNickename)
            self.cursor.execute(sql1)
            
            self.conn.commit()
            insertId = self.cursor.lastrowid
            return self.success(insertId)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '回复失败')
        
class ReplyeditHandler(BaseHandler):
    def GET(self):
        id = self.get_argument("id", "0")
        content = self.get_argument("content", "")
        sessionId = self.get_argument("sessionId", "")
        userinfo = super().getloginuserinfo(sessionId)
        userId = userinfo['id']
        userNickename = userinfo['nickname']
        
        if userId <= 0:
            return self.error(1, '请先登录')

        try:
            sql = "update reply set content='%s',replyUserId=%s,replyUserNickename='%s' where id=%s and replyUserId=%s" % (content, userId, userNickename, id, userId)
            self.cursor.execute(sql)
            self.conn.commit()
            return self.success(None)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '编辑回复失败')
        
class ReplydeleteHandler(BaseHandler):
    def GET(self):
        id = self.get_argument("id", "0")
        sessionId = self.get_argument("sessionId", "")
        userinfo = super().getloginuserinfo(sessionId)
        userId = userinfo['id']
        userNickename = userinfo['nickname']
        
        if userId <= 0:
            return self.error(1, '请先登录')

        sql = "select id,content,replyUserId,replyUserNickename,addTime,contentId from reply where isDel=0 and id=%s" % id
        self.cursor.execute(sql)
        contentdata = self.cursor.fetchone()
        
        if contentdata is None:
            return self.error(1, '回复不存在')

        try:
            sql2 = "update content set replyNum=replyNum-1 where id=%s" % contentdata['contentId']
            self.cursor.execute(sql2)
            sql1 = "update reply set isDel=1 where id=%s and replyUserId=%s" % (id, userId)
            self.cursor.execute(sql1)
            
            self.conn.commit()
            return self.success(None)
        except MySQLdb.Error as e:
            self.conn.rollback()
            return self.error(1, '删除回复失败')

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

 

输出:

D:\workspace\studys\study_pys\pc_app\dist>D:\software\Python310\python.exe D:\workspace\studys\study_bbs\start_web_webpy.py 1092
http://0.0.0.0:1092/

 

标签:return,python,bbs,self,cursor,sessionId,data,id,webpy
From: https://www.cnblogs.com/xuxiaobo/p/18392600

相关文章

  • [开题报告]flask框架的高校医务室管理系统(程序+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大和学生健康意识的增强,高校医务室作为维护师生健康的重要机构,其管理效率与服务质量直接影响到师生的日常生活与学习......
  • 推荐一个Python打造的开源自动驾驶平台:Donkeycar!
    1、引言随着人工智能和自动驾驶技术的飞速发展,自动驾驶车辆的研究和开发成为了科技领域的热点。对于初学者、爱好者和学生而言,一款易于上手且功能强大的自动驾驶平台显得尤为重要。Donkeycar正是这样一款开源项目,它提供了一个轻量级、模块化的Python自驾车库,旨在促进快速实验和社区......
  • 如何使用 Python 调用 DPAPI ?
    在Windows环境下,DPAPI(DataProtectionAPI)是一种用于加密和解密数据的API,可以保护数据,使其只能由当前用户或计算机访问。在Python中,可以通过Cryptography或pywin32等库来使用DPAPI进行数据加密和解密。以下是我我做项目时使用Python调用DPAPI进行数据加密和解密的示......
  • [开题报告]flask框架的机电配件管理系统(程序+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快速发展的机电行业中,配件管理作为保障设备高效运行与维护的重要环节,其重要性日益凸显。随着企业规模的扩大和生产复杂度的提升,传统的配......
  • 基于micropython的ESP8266控制触摸传感器的设计方案
       以下是一个基于MicroPython的ESP8266控制触摸传感器的设计方案:一、硬件准备1. ESP8266开发板(如NodeMCU)       2. 触摸传感器模块(如TTP223触摸传感器)   3. 杜邦线若干                    ......
  • 0基础学习Python路径(40)operator模块
    operator模块operator模块提供了一套与Python的内置运算符对应的高效率函数。函数的种类函数包含的种类有:对象的比较运算、逻辑运算、数学运算和序列运算比较运算运算函数语法小于lt(a,b)a<b小于等于le(a,b)a<=b大于gt(a,b)a>b大于等于ge(a,b)a>=b等于eq(......
  • Python股票程序交易接口查账,提交订单,自动交易(2)
    Python股票接口实现查询账户,提交订单,自动交易(1)上一篇是获取数据,获取数据不难,有很多第三方库都可以获取,不一定非要用券商官方的接口,程序交易主要是交易的执行,这个没有官方接口是很难实现的。券商的接口不用担心安全和稳定的问题,相当于就是普通股票账户,开通了程序化交易的权......
  • Python Poetry fails to add openai-whisper due to triton installation error
    题意:PythonPoetry因Triton安装错误而无法添加openai-whisper。问题背景:soimtryingtouseopenai-whisper.i'musingpoetryasmyenvanddependecymanager.butkeepgettingerrorswhentryingtodownloadit.theerrorigetis,Installingtriton(2.0.......
  • [oeasy]python0032_ 火星文字幕_os_操作系统的作用_time_sleep_延迟
     032导入_import_os_time_延迟字幕效果_道德经文化_非主流火星文154播放·0赞同视频​ show:stepversion:1.0enable_checker:trueHelloWorld!回忆上次内容这次我们了解了unix系统在multics项目失败后汤普森和里奇为了玩游戏自制了u......
  • Python/MySQL无法正确持久化整数数据
    如果在Python中使用MySQL时无法正确持久化整数数据,可能有以下几个原因:数据类型不匹配:确保在MySQL表中定义的列的数据类型与你在Python中要插入或更新的整数数据类型相匹配。例如,如果列的数据类型是INT,则在Python中应该使用整数类型(如int)来表示数据。连接参数问题:检查你......