今天来用flask做一个很简单的http服务
首先安装要用到的模块
pip install flask
pip install flask-restful
这是我的脚本结构:
废话不多说,直接上代码:
一,服务端代码:
# -*- coding:utf8 -*-
from flask import Flask, jsonify
from flask_restful import reqparse, abort, Api, Resource
import hashlib
import requests
from bs4 import BeautifulSoup
app = Flask(__name__)
api = Api(app)
# 定义装饰器,用来验证token,也可以使用加密方式进行加密处理
# func代表装饰对象的名字
def checkToken(func):
def handle_args(*args, **kwargs): # 处理传入函数的参数
m = hashlib.md5()
m.update(b"123")
new_token = m.hexdigest()
if kwargs['token'] != new_token:
abort(403, message="请带入正确的token")
else:
return func(*args, **kwargs) # 函数调用
return handle_args
'''Flask-RESTful提供了一个用于参数解析的RequestParser类,类似于Python中自带的argparse类,可以很方便的解析请求中的-d参数,并进行类型转换。
用来接收客户端传过来的参数数据
'''
parser = reqparse.RequestParser()
parser.add_argument('url')
parser.add_argument('User-Agent')
# post /api/users
class baidu(Resource):
@checkToken
def post(self, token):
args = parser.parse_args()
# 返回规定格式的数据
result = {}
result['code'] = 200
#下面是爬虫部分
url=args['url']
user_agent=args['User-Agent']
heards={
'User-Agent':user_agent
}
rq=requests.get(url,heards)
rq.encoding='utf8'
soup=BeautifulSoup(rq.text,'lxml')
btn_text=soup.find('input',id='su')['value']
print(btn_text)
result['data'] = {'btn_text':btn_text}
return jsonify(result)
class zgzf(Resource):
@checkToken
def get(self, token):
args = parser.parse_args()
# 返回规定格式的数据
result = {}
result['code'] = 200
#下面是爬虫部分
url = 'https://cd.zhuge.com/?spread=sem_pc_baidu_pz'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
heards = {
'User-Agent': user_agent
}
rq = requests.get(url, heards)
rq.encoding = 'utf8'
soup = BeautifulSoup(rq.text, 'lxml')
btn_text = soup.find('a', class_='hover').get_text()
print(btn_text)
result['data'] = {'btn_text':btn_text}
return jsonify(result)
api.add_resource(baidu, '/api/baidu/<token>')
api.add_resource(zgzf, '/api/zgzf/<token>')
if __name__ == '__main__':
# 设置一下,显示内容为字符串,而不是字节码
app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))
app.config['JSON_AS_ASCII'] = False
# app.run(host='127.0.0.1', port='8080')
app.run(debug=True)
可以看到,我这边定义了两个类,第一个是baidu(百度),里面的方法定义了一个post,里面有一部分是爬虫程序,url和user-agent是从客户端传过来的,这段代码简单的实现了一下爬虫程序,即得到百度首页的百度一下几个字
可以看一下下面的客户端post请求的代码。
第二个是zgzf(诸葛找房),里面定义的是一个get方法,url和user-agent是写进去的,调动这段程序运行只需要客户端访问咱们这个服务端的网址就行了,不用传参,咱们的服务端里最后一行app.run(debug=True)这个方法运行了之后,默认生成的咱们服务器的网址是这个: http://127.0.0.1:5000/
具体访问方法可以看下面的客户端脚本,get请求的
二、接下来是客户端脚本:
客户端我写了两个脚本,一个是get请求,一个是post请求,先看post请求的
post请求方式就是访问咱们服务端的网址加上加密后的token,然后带上要传递的data参数就行了,要访问的是baidu那个类下面的post方法,title写baidu
# -*- coding:utf8 -*-
"""
@desc: ⽤注册客户端调用
"""
from urllib import request,parse
import hashlib
import requests
m=hashlib.md5()
m.update(b"123")
new_token=m.hexdigest()
title='baidu'
server_url="http://127.0.0.1:5000/api/{}/".formart(str(title))+new_token
data={
'url':'https://www.baidu.com/?tn=25017023_1_dg',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
}
rq=requests.post(server_url,data=data)
rq.encoding='utf8'
results=rq.text
print(results)
然后是get请求:
get请求更简单一些,直接访问咱们服务端的网址就行了,咱们访问的是(zgzf)诸葛找房那个类下的get方法,所以title就得写成zgzf,才能组成正确的服务端网址
# -*- coding:utf8 -*-
"""
@desc: ⽤注册客户端调用
"""
# from urllib import request,parse
import hashlib
import requests
m=hashlib.md5()
m.update(b"123")
new_token=m.hexdigest()
title='zgzf'
server_url="http://127.0.0.1:5000/api/{}/".format(str(title))+new_token
print(server_url)
rq=requests.get(server_url)
rq.encoding='utf8'
results=rq.text
print(results)
三、最后就是运行了,先把服务端代码跑起来,他就会一种处于等待访问状态
这里注意的是,服务端的代码有改动的时候,记得重新运行一下哦
然后咱们运行客户端的post脚本,刚才前面说了,这个post脚本的目的是调动服务端的那个baidu类里面的post方法,得到百度一下四个字,咱们运行post脚本:
怎么样,你在post脚本里只需要定义网址和user-agent就可以得到爬虫的返回值了
接下来我们运行get脚本,get脚本的目的是访问zgzf(诸葛找房)网站,得到首页俩字
咱们运行get脚本:
成功返回了咱们想要的内容
总结:这个简单的小例子只是用爬虫来举的,像服务端爬虫那一段代码,你把他换成数据库操作的代码,客户端传递的参数和服务端接收的参数改一下。再把post方法改成做数据存储,get方法改成做数据查询。不管这两个方法写在一个类还是写在两个类下面都无所谓,这样一来是不是就做出来了一个注册登录的http服务了
post方法接收参数之后把参数存起来,比如name,password。这就相当于是一个用户做了注册操作
get方法做查询匹配,根据他传过来的参数,匹配数据库里的名字密码,能匹配就是登陆成功,不能匹配就是登陆失败
总之还是有不少好用的地方,大家自己想想怎么改一下,边玩边学习把
如果我的分享对你有所启发或帮助,记得点赞鼓励哦