用flask-restful搭建超级简单的http服务

今天来用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方法做查询匹配,根据他传过来的参数,匹配数据库里的名字密码,能匹配就是登陆成功,不能匹配就是登陆失败
总之还是有不少好用的地方,大家自己想想怎么改一下,边玩边学习把

如果我的分享对你有所启发或帮助,记得点赞鼓励哦

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值