本次分享的项目信息如下
项目仓库地址在文章末尾,下面我们来了解一下这个简单的练手。
项目需求是实现游戏公会出征统计(18年盛行的红衣军团玩法和公会),在出征前登记所有要出征的人员信息。
我个人搭建web项目喜欢从前端页面开始,以便于确定后端的功能需求。
首先,这个页面不需要登录,仅仅需要简单的一个收集表,一个提交按钮即可。所以,我们构建一个基础的不美化的表单页面,如下:
出征登记
xxxx登记
这样我们会得到一个极简的表单页面,前端的工作就结束了,接下来我们在目录下创建Python脚本程序(.py文件)。这个项目原本是采用的flask框架。后来为了便于管理和提升性能(最后这个项目没多久就不使用了),采用了更加完善的tornado框架。
为了使用tornado框架,我们需要引入tornado库,如果您的电脑未安装该库,可以在CMD或终端通过以下命令安装tornado库:
pip install tornado
安装好后我们使用import将他引入到我们的项目中,并根据自己的需求构建基础的启动代码,下面代码的含义通过注释表达:
from tornado import web,ioloop,httpserver #tornado 框架需要
import gc #清理缓存
import time #获取时间
import socket #socket
SIGN_FILE_HANDLER = open('sign.csv', 'a')
SIGN_FILE_HANDLER.write('姓名')
SIGN_FILE_HANDLER.write('部门')
SIGN_FILE_HANDLER.write('编号\n')
SIGN_FILE_HANDLER.close()
port = input("inport post: ") #自定义端口,手动输入
int(port)
print("port is {a} are you sure?".format(a = port))
#文件句柄
SIGN_FILE_HANDLER = open('sign.csv','a') #以追加的方法打开sign.csv
#表头
#ybd = time.localtime("%U")
SIGN_FILE_HANDLER.write('签到记录\n,%s,%s,%s,%s\n' %("姓名",'部门','工号','时间'))
errornum = 0 #异常判断参数,0为正常,大于3的时候表示错误
#逻辑处理模块
class SignpageHandler(web.RequestHandler):
def get(self):
try:
self.render('sign.html')
gc.collect()
except:
print("Error!\n 返回签到页面时出现异常")
def post(self, *args, **kwargs): #接受来自前端的信息
try:
user = self.get_argument('user')
depar = self.get_argument('depar')
num = self.get_argument('num')
#写入到sign.csv文件
nowtime = time.localtime()
print(user,depar,num,"time:%s" %(nowtime)) #在后端打印最新签到数据
signtime = time.strftime("%U:%u:%F %H:%M:%S") #获取当前时间(一年中第几周的星期几,年月日,24小时制时间)
SIGN_FILE_HANDLER.write('%s,%s,%s,%s\n' %(user,depar,num,signtime)) #写入文件
SIGN_FILE_HANDLER.fileno()
self.write('签到成功,时间:%s' %(signtime))
gc.collect()
except:
t = time.strftime("%F %H:%M:%S")
print("Error!\n 在签到页面出现异常 time:%s" %t)
else:
t = time.strftime("%F:%H:%M:%S")
print("客户端访问签到页面一次,没有发生意外 time:%s" %t)
# 用户签到处理模块;
class SignPageHandlers(web.RequestHandler):
# 当用户请求为get时,跳转页面到签到页面;
def get(self, *args, **kwargs):
self.render("sign.html")
# 当用户请求为post时,对用户提交信息做验证,并存储签到信息到文件中;
def post(self, *args, **kwargs):
name = self.get_argument('name')
department = self.get_argument('department')
num = self.get_argument('num')
if name and department and num:
print(name, department, num)
# 将用户签到信息写入文件中;
SIGN_FILE_HANDLER.write('%s,%s,%s\n' %(name, department, num))
# 手动刷新, 将缓冲区内容写入的文件;
SIGN_FILE_HANDLER.flush()
self.write('签到成功!')
else:
self.write('请填写正确的签到信息!')
#网站路由
try:
application = web.Application([
(r"/signs",SignPageHandlers),
(r"/sign", SignpageHandler), # 签到页面
(r"/webcs",WEB_TWOHTML_FILE), #web测试页面
])
except:
print("Error!\n 路由出现错误")
#服务(前台)
if __name__ == '__main__':
##18年老项目了,没写静态文件分离和日志记录等功能
host_name = socket.gethostname() # 获取主机名
ip_address = socket.gethostbyname(host_name) # 获取主机名对应的IP地址
url = ('http://' + ip_address + ':' + port) #拼接出url
urlindex = ('http://' + ip_address + ':' + port + '/index') #拼接出首页url
print("url: %s \n主页::%s" % (url,urlindex))
http_server = httpserver.HTTPServer(application)
http_server.listen(port) #监听端口
ioloop.IOLoop.current().start()
这样就完成了大部分的工作了,剩下的根据自己需求调整即可。
最后附上我的项目仓库:
仓库地址:https://gitee.com/wubie/custom-online-sign-in