目的
搭建一个web服务,想这个传递一个IP地址,返回IP地址所在的国家城市。为了长久的使用,将服务做成容器,可以随意拉取、启动。
一、下载文件
网址
先注册账号,然后去邮箱的邮件中设置密码,然后登陆,就可以下载免费的数据了,
注意要下载mmdb数据。
二、编写python代码
这是个很简单的服务,我决定使用tornado来写,简单快捷
// 我起名叫 01.py
import json
import re
import tornado.ioloop
import tornado.web
import geoip2.database
path = r"GeoLite2-City.mmdb"
def huoqu(str2):
if not re.match(r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$",
str2):
return ["IP地址不合法"]
reader = geoip2.database.Reader(path)
if str2 == "127.0.0.1":
return ["本地国家", "本地城市"]
elif str2.split(".")[0] == "10":
return ["本地国家", "本地城市"]
elif str2.split(".")[0] == "192" and str2.split(".")[1] == "168":
return ["本地国家", "本地城市"]
else:
response = reader.city(str2)
country = response.country.names['zh-CN']
if response.city.names:
if "zh-CN" in response.city.names.keys():
city = response.city.names['zh-CN']
elif "en" in response.city.names.keys():
city = response.city.names['en']
else:
city = "未知"
else:
city = "未知"
return [country,city]
class BaseHandler(tornado.web.RequestHandler):
# 允许跨域访问的地址
def allowMyOrigin(self):
allow_list = [
'http://127.0.0.1:7100',
]
if 'Origin' in self.request.headers:
Origin = self.request.headers['Origin']
# 域名
re_ret = re.match(r".{1,}\.(xixi.com|haha.com)", Origin)
# 内网和本地
re_ret2 = re.match(r"^(192.168.1.*|127.0.0.1.*|192.168.2.*)", Origin)
if re_ret or re_ret2 or Origin in allow_list:
self.set_header("Access-Control-Allow-Origin", Origin) # 这个地方可以写域名也可以是*
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
class MainHandler(BaseHandler):
def get(self):
self.write("服务正在运行!!!")
def post(self):
remote_ip = self.request.remote_ip
talk1 = self.get_argument('ip', None)
if self.request.body:
talk2 = json.loads(self.request.body.decode("utf8")).get("ip", None)
else:
talk2 = None
if talk1:
response = huoqu(talk1)
elif talk2:
response = huoqu(talk2)
else:
response = huoqu(remote_ip)
self.write(json.dumps(response, ensure_ascii=False))
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
print("服务启动")
app = make_app()
app.listen(6002)
tornado.ioloop.IOLoop.current().start()
代码部分就结束了。
三、云服务器上安装和配置docker
略
四、通过dockerfile构建镜像
在 /home/linshi文件夹下面创建文件getpositionfile,文件没有后缀,只有名字
// 路径 /home/linshi/getpositionfile
FROM python
RUN pip install tornado
RUN pip install geoip2
COPY 01.py GeoLite2-City.mmdb /home/fuwu/
ENV TZ=Asia/Shanghai
RUN echo '镜像构建完成'
ENV TZ=Asia/Shanghai这句话的意思是配置时间为上海时间,没什么用,我习惯这么配置
注意将代码文件和数据库文件复制到getpositionfile同级目录
然后在/home/linshi执行构建镜像的,命令
docker build -f getpositionfile -t getposition .
# 注意最后有个点,别漏掉
五、根据镜像启动容器
docker run -itd --name getposition -p 6002:6002 --restart=always getposition sh -c "python /home/fuwu/01.py"
六、测试
访问那台机器的6002端口,如果有返回,就没错了
七、将容器封装为镜像
# 将getposition 容器封装为镜像,名字自己起
docker commit getposition ****
# 查看所有镜像里面有没有刚封装好的
docker images
本文介绍如何使用Python和Tornado框架实现一个简单的IP地址地理位置定位服务,并将其容器化以便于部署和管理。服务能接收IP地址输入并返回该IP所在的城市和国家信息。
6441

被折叠的 条评论
为什么被折叠?



