大家好,欢迎来到IT知识分享网。
接昨天,把所有服务端的mock都实现:
上代码:
"""
---------------------------------------------------------------------------------------
1.功能1:收集长链接并生成短链接
dag流程:收集长URL,并确认长URL有效,如果有效则生成短URL,并传递到后端服务器。
1-1 收集长URL: 通过在index.html 中设计一个表单,客户输入表单后,用requests.form 方法获取表单内容
1-2 检查长URL是否有效:通过checkurl(longurl)函数,当longurl 有效则返回1,否则返回0 【客户端】
1-3 生成短URL:通过createshorturl(longurl)函数,从长url里面截取字段另外加上时间来生成一个短url 【客户端】
1-4 传递到后端服务器:把长短URL的关系记录到后端 【客户端】 【服务端】
具体实现可以通过requests.post 方法,向对应的restful api 进行请求(备注1),传递jason字段(备注2)
备注1:这里指post 的url,指requsts.post 请求对应的Url,建议post的url要详细到具体的接口,比如127.0.0.1:8008/api/shorturlcreate 接口,这样后端服务器可以根据接口特性来进行相应的逻辑处理
备注2:制作字典,按照 dic1= {短链:{"长链":长链,"访问日期":"null","创建日期":date}} 创建
另外,requests.post 方式,选择data=json 方式传递,json字段是对备注2里字典信息做字符串序列化的结果 json.dumps(dic1)
2.功能2:收集短链接做相关跳转
dag流程:收集短url,如果短url存在,则接收服务端的redirect请求,跳转到短URL对应的长URL链接上。
2-1 收集短url:通过在index.html设计一个表单,客户输入表单后,用requests.form方法获取表单内容
2-2 检查短url是否存在:通过checksurl(shorturl)函数,当shorturl有效则返回1,否则返回0 (服务端)
2-3 跳转到长URL:通过jumpurl(shorturl)函数,请求到服务端。服务端先判断短URL是否存在,如果存在则做redirect。
jumpurl函数设计:
1.访问到后端服务器,requests.post(url/api/jump,""), 后端服务器根据URL具体的api来返回信息,返回值里包含了URL信息
2.服务端要构造返回的Header值,根据Location 参数 ,让客户浏览器跳转到对应的长链URL中
3.功能3:请求某个短链的访问信息,并进行展示:
dag流程:收集短url 对应的信息,如果短URL存在,则返回这个短URL被调度的次数等信息
3-1 在第2-3步,每次服务端指定后端做跳转的时候,把短URL被访问的时间做一个记录。
服务端操作:
每次访问短链的时候,对访问情况做个统计:
3-1-1: {短url:访问时间} 存入redis 另外一个表里。
3-2-2:对之前的 数据结构做个更新,主要是对 shorturl 的value做个update,访问时间增加一行。
3-2 发起请求,通过requests.post() 函数,传参数为 /api/statics ,到后端
收集后端返回的json字符串,查询时间,短url,以及这个url的访问列表,{date:[list],"shorturl",url, visittime:[list]}。
用json.loads() 把信息拿到,然后收集visittime的信息,
按照天的维度对visittime做一个图像化。---作业。
redis 数据结构设计:
key:value
shorturl:{"对应的长链接":longurl,"访问时间":[visitdate1,visitdate2],"创建时间":createdate}
把短链做为Key,把长链的信息、访问时间,创建时间作为value,
---------------------------------------------------------------------------------------
"""
import redis
import re
import json
import time
import cgi
from redis import StrictRedis, ConnectionPool
from flask import Flask,jsonify,request
import requests
app = Flask(__name__)
def insert_into_redis(shorturl,longurl):
# 如果含义为插入,则做插入操作
pool = ConnectionPool(host='localhost', port=6379, db=0, decode_responses=True)
# redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。
r = StrictRedis(connection_pool=pool)
string = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
r.hset("shorttolong",shorturl, json.dumps({"longurl": longurl,"visittime": [], "creattime":string}))
r.hset("longtoshort",longurl,shorturl)
print("The value {0} is inserted".format(shorturl))
return 1
def check_if_exist(longurl):
pool = ConnectionPool(host='localhost', port=6379, db=0, decode_responses=True)
r = StrictRedis(connection_pool=pool)
# 判断是否存在,如果存在则返回1
if r.hexists("longtoshort",longurl):
result = 1
else:
result = 0
return result
def get_longurl(shorturl):
pool = ConnectionPool(host='localhost', port=6379, db=0, decode_responses=True)
r = StrictRedis(connection_pool=pool)
# 判断是否存在,如果存在则返回1
longurljson = r.hmget("shorttolong",shorturl)
longurl = json.loads(longurljson[0])["longurl"]
#print(longurljson)
#print(longurl)
return longurl
def update_jumptime(shorturl):
pool = ConnectionPool(host='localhost', port=6379, db=0, decode_responses=True)
r = StrictRedis(connection_pool=pool)
longurljson = r.hmget("shorttolong", shorturl)
dic1 = json.loads(longurljson[0])
list1 = dic1["visittime"]
print(list1)
string = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
list1.append(string)
dic1["visittime"] = list1
r.hset("shorttolong", shorturl, json.dumps(dic1))
print("info: update the visittime of the {0} success".format(shorturl))
return 1
def redirect_to_longurl(longurl):
redirect("https://"+longurl)
return 1
"""
0.判断长链接是否已经存在
在用户端进行创建的时候,要检查长链接是否已经在服务端存在了,如果存在应该忽略。
如何确定服务端存在,通过post 接口来查询。
检查长URL是否有效:通过checkurl(longurl)函数,当longurl 已经存在,
返回json字段{'result':1},不存在则否则返回{'result':0}
"""
@app.route('/api/checkurl', methods=['POST'])
def check_url():
longurl = request.json['longurl']
result = check_if_exist(longurl)
print(result)
return jsonify({'result':result,"longurl":longurl}),200
"""
1.收集长链接生成短链接:
根据客户端的post 请求,收集客户端发送的shorturl以及longurl,把关联关系插入到redis中
插入的时候,redis表中有两个hash库,
"shorttolong" 库,结构为 shorturl:{"longurl":longurl,"visittime",{},"createtime":string}
"longtoshort" 库,结构为 longurl:shorturl
"""
@app.route('/api/shorturlcreate',methods=['POST'])
def shorturl_create():
shorturl = request.json['shorturl']
longurl = request.json['longurl']
insert_into_redis(shorturl, longurl)
print("info: insert into redis {0}:{1} success".format(shorturl,longurl))
return jsonify({"info":"insert into redis "+longurl+shorturl+" pair succuss"})
"""
2.收集短链接做相关跳转:
客户端发出短链接请求,
2-1: 判断短链接是否存在
2-2: 如果存在,则找到对应的长链接
2-3: 返回301 指令,并让客户端做跳转
"""
@app.route('/api/shorturljump',methods=['POST'])
def shorturl_jump():
shorturl = request.json['shorturl']
# getlongurl mock
longurl=get_longurl(shorturl)
# 增加一个跳转的时间,对他记录。
# redis_update_jumptime(shorturl) mock
update_jumptime(shorturl)
# jumpto destination longurl,mock
print("info: jump to destination longurl {0} ".format(longurl))
#redirect_to_longurl(longurl)
return jsonify({"info": "jump to "+ longurl + " succuss"})
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8008,debug = True)
效果图:
插入一个网站: longurl : www.163.com shorturl: 163
检查网站是否存在:longurl :163
登录redis后台,查看相关信息:
做jump 操作,后台会update 跳转时间,并做redirect 动作,
看到visittime被udpate了
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/49574.html