上次我们一起完成了一个初级API服务器的搭建。今天我们将为其添加一些新功能。这取决于之前的内容。点击此处1.改进设计在第二种设计中,我们定义了三张表,AdminUser,用于调用API认证用户,User,用于存储普通用户,Picture,用于存储用户上传的图片。但是当时只是实现了AdminUser的相关功能,User和Picture并没有真正的关联。这一次,他们得到了改进。2.测试服务器为了方便测试,我们在这里写了一个简单的测试web服务器,用于将网页向API服务器发送请求。代码很简单,还是用flask启动服务器,返回一个页面。@app.route('/jupload',methods=['POST','GET'])defjupload():returnrender_template('js_upload.html')返回的页面也很简单,包括一个表单,用来提交数据。指定用户名:
上传文件:
服务后up,大概是这样吧,不要嫌弃它丑,只要能用就行。这么简单的测试服务器就好了。3.前端代码前端代码使用Ajax提交数据和回显数据代码比较基础,定位元素,调用函数,说下载这里的url,就是我在本地启动的API服务器的地址。同时还在监听服务器的返回,获取返回的p_url来展示图片。4.后端代码先判断前端上传的是否是图片文件,如果不是,则直接返回错误if'PID'notinrequest.files:returnjsonify({'code':-1,'filename':'','msg':'请选择一张图片上传'})如果判断通过,获取图片和用户名user=request.form.get('UID')f=request.files['PID']并在本地创建一个目录用于保存图片,并开始处理User和Picture的关系basepwd=os.getcwd()pwd=os.path.join(basepwd,r'app')tmp_path=os.path.join(pwd,r'static/%s'%user)new_filename=str(time.time())+'.'+f.filename.split('.')[1]如果不是os.path.exists(tmp_path):os.makedirs(tmp_path)upload_path=os.path.join(tmp_path,secure_filename(new_filename))f.save(upload_path)如果User.query.filter_by(username=user).first():u=User.query.filter_by(username=user)。first()u.picture_count+=1p=图片(picture_name=user,picture=upload_path,picture_id=u.id)db.session.add(u)db.session.add(p)db.session.commit()如果该目录不存在,请创建它并保存图片。如果数据库中存在该用户,将picture_count加1,同时更新Picture表,将picture_id与user_id关联起来。如果用户不存在,先插入用户,提交,然后更新Picture表newu=User(username=user)db.session.add(newu)db.session.commit()newp=Picture(picture_name=user,picture=upload_path,picture_id=newu.id)db.session.add(newp)db.session.commit()最后API返回p_url供前端web显示returnjsonify({"p_url":'http://127.0.0.1:9980/static/%s/'%user+new_filename})5.最终效果最终效果如下同时在项目的static目录下,会生成每个用户的图片,因为图片是使用time.time()命名的,不存在重名覆盖的问题。6.任重而道远。改进到此结束,但是程序中还有很多问题。比如在网页端没有填写姓名或者选择图片,则存在一些问题;同时还可以增加一些接口,比如获取用户的所有图片,等待。让我们把这些留到以后再说。虽然现在的项目很小,但是CI还是很有必要的。后面再说说如何结合GitHub进行持续集成。完整代码见这里:https://github.com/zhouwei713/mini_api