前言

用Python如何写一个接口呢,首先得要有数据,可以用我们在网站上爬的数据,在上一篇文章中写了如何用Python爬虫,有兴趣的可以看看:https://www.jb51.net/article/141661.htm

大量的数据保存到数据库比较方便。我用的pymsql,pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。但目前在python3.x中,PyMySQL取代了MySQLdb。

1.连接数据库

# 连接数据库,需指定charset否则可能会报错

db = pymysql.connect(host="localhost", user="root", password="123", db="mysql", charset="utf8mb4")

cursor = db.cursor() # 创建一个游标对象

2.创建数据库

cursor.execute("DROP TABLE IF EXISTS meizi_meizis") # 如果表存在则删除

# 创建表sql语句

createTab = """create table meizi_meizis(

id int primary key auto_increment,

mid varchar(10) not null,

title varchar(50),

picname varchar(10),

page_url varchar(50),

img_url varchar(50)

);"""

cursor.execute(createTab) # 执行创建数据表操作

3.爬取数据

def html(self, href, title):

lists = []

meiziid = href.split('/')[-1]

html = self.request(href)

max_span = BeautifulSoup(html.text, 'lxml').find('div', class_='pagenavi').find_all('span')[-2].get_text()

for page in range(1, int(max_span) + 1):

meizi = {}

page_url = href + '/' + str(page)

img_html = self.request(page_url)

img_url = BeautifulSoup(img_html.text, 'lxml').find('div', class_='main-image').find('img')['src']

picname = img_url[-9:-4]

meizi['meiziid'] = meiziid

meizi['title'] = title

meizi['picname'] = picname

meizi['page_url'] = page_url

meizi['img_url'] = img_url

lists.append(meizi) # 保存到返回数组中

return lists

4.保存到数据库

def all_url(self, url):

html = self.request(url)

all_a = BeautifulSoup(html.text, 'lxml').find('div', class_='all').find_all('a')

for index, a in enumerate(all_a):

title = a.get_text()

href = a['href']

lists = self.html(href, title)

for i in lists:

# print(i['meiziid'], i['title'], i['picname'], i['page_url'], i['img_url'])

# 插入数据到数据库sql语句,%s用作字符串占位

sql = "INSERT INTO `meizi_meizis`(`mid`,`title`,`picname`,`page_url`,`img_url`) VALUES(%s,%s,%s,%s,%s)"

try:

cursor.execute(sql, (i['meiziid'], i['title'], i['picname'], i['page_url'], i['img_url']))

db.commit()

print(i[0] + " is success")

except:

db.rollback()

db.close() # 关闭数据库

5.创建Web工程

运行我们的爬虫,很快数据库表里就有数据了。

然后开始写接口。我是通过Django+rest_framework来写的。

Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站。Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,减少重复的代码。

Django 目录结构

urls.py

网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。

views.py

处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。

models.py

与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。

forms.py

表单,用户在浏览器上输入数据提交,对数据的验证工作以及输入框的生成等工作,当然你也可以不使用。

templates 文件夹

views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。

admin.py

后台,可以用很少量的代码就拥有一个强大的后台。

settings.py

Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。

Django 常用操作

1)新建一个 django project

django-admin.py startproject project_name

2)新建 app

python manage.py startapp app_name

一般一个项目有多个app, 当然通用的app也可以在多个项目中使用。

还得在工程目录的settings.py文件在配置

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'rest_framework',

'meizi',

]

在app/views.py下编写代码

def index(request):

return HttpResponse(u"你好")

在工程目录urls.py配置

from learn import views as learn_views

urlpatterns = [

url(r'^$', learn_views.index),

]

通过python manage.py runserver启动,就会看到我们输出的“你好”了

3)创建数据库表 或 更改数据库表或字段

在app下的models.py创建表

class Person(models.Model):

name = models.CharField(max_length=30)

age = models.IntegerField()

def __unicode__(self):

# 在Python3中使用 def __str__(self):

return self.name

运行命令,就可以生成对应的表

Django 1.7.1及以上 用以下命令

# 1. 创建更改的文件

python manage.py makemigrations

# 2. 将生成的py文件应用到数据库

python manage.py migrate

在views.py文件里就可以获取数据库的数据

def create(request):

# 新建一个对象的方法有以下几种:

Person.objects.create(name='xiaoli', age=18)

# p = Person(name="WZ", age=23)

# p = Person(name="TWZ")

# p.age = 23

# p.save()

# 这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,

# 第二个为True或False, 新建时返回的是True, 已经存在时返回False

# Person.objects.get_or_create(name="WZT", age=23)

s = Person.objects.get(name='xiaoli')

return HttpResponse(str(s))

6.写接口

接口使用rest_framework,rest_framework是一套基于Django 的 REST 框架,是一个强大灵活的构建 Web API 的工具包。

写接口三步完成:连接数据库、取数据、数据输出

1)连接数据库

在工程目录下的settings.py文件下配置

DATABASES = {

# 'default': {

# 'ENGINE': 'django.db.backends.sqlite3',

# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

# }

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'mysql',

'USER': 'root',

'HOST': '127.0.0.1',

'PASSWORD': '123',

'PORT': 3306,

# show variables like 'character_set_database';

# 修改字段字符编码

# alter table spiders_weibo modify text longtext charset utf8mb4 collate utf8mb4_unicode_ci;

'OPTIONS': {'charset': 'utf8mb4'},

}

}

2)取数据

既然要取数据,那model肯定得和数据库的一致,我发现一个快捷的方式可以把数据库中的表生成对应的model,在项目目录下执行命令

python manage.py inspectdb

可以看到下图

取我们表的model拷贝到app下的models.py里

class Meizis(models.Model):

mid = models.CharField(max_length=10)

title = models.CharField(max_length=50, blank=True, null=True)

picname = models.CharField(max_length=10, blank=True, null=True)

page_url = models.CharField(max_length=50, blank=True, null=True)

img_url = models.CharField(max_length=50, blank=True, null=True)

class Meta:

managed = False

db_table = 'meizi_meizis'

创建一个序列化Serializer类

提供序列化和反序列化的途径,使之可以转化为,某种表现形式如json。我们可以借助serializer来实现,类似于Django表单(form)的运作方式。在app目录下,创建文件serializers.py。

class MeiziSerializer(serializers.ModelSerializer):

# ModelSerializer和Django中ModelForm功能相似

# Serializer和Django中Form功能相似

class Meta:

model = Meizis

# 和"__all__"等价

fields = ('mid', 'title', 'picname', 'page_url', 'img_url')

这样在views.py就可以来获取数据库的数据了

meizis = Meizis.objects.all()

serializer = MeiziSerializer(meizis, many=True)

return Response(serializer.data)

3) 数据输出客户端或前端

REST框架提供了两种编写API视图的封装。

@api_view装饰器,基于方法的视图。

继承APIView类,基于类的视图。

request.data会自行处理输入的json请求

使用格式后缀明确的指向指定的格式,需要添加一个format关键字参数

http http://127.0.0.1:8000/getlist.json # JSON 后缀

http://127.0.0.1:8000/getlist.api # 可视化 API 后缀

http://127.0.0.1:8000/getlist/ code="print 123"post

@api_view(['GET', 'POST'])

def getlist(request, format=None):

if request.method == 'GET':

meizis = Meizis.objects.all()

serializer = MeiziSerializer(meizis, many=True)

return Response(serializer.data)

elif request.method == 'POST':

serializer = MeiziSerializer(data=request.data)

if serializer.is_valid():

serializer.save()

return Response(serializer.data, status=status.HTTP_201_CREATED)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

4)分页

最后别忘了在urls.py配置URL,通过浏览器就可以看到json数据了。

当然app也是可以调用我们的接口的

还有个问题

我们的数据有好几千条,一块返回来很不合理,所以需要分页,当然rest_framework框架提供了这个功能,post请求不支持,需要自己查数据库或者切片来进行返回。来看看rest_framework是如何来分页的。在models.py里创建一个类

class StandardResultSetPagination(LimitOffsetPagination):

# 默认每页显示的条数

default_limit = 20

# url 中传入的显示数据条数的参数

limit_query_param = 'limit'

# url中传入的数据位置的参数

offset_query_param = 'offset'

# 最大每页显示条数

max_limit = None

在serializers.py创建俩个类,为什么是俩个?因为我们有俩个接口,一个明细,一个列表,而列表是不需要把字段的所有数据都返回的

class ListSerialize(serializers.ModelSerializer):

class Meta:

model = Meizis

fields = ('mid', 'title')

class ListPicSerialize(serializers.ModelSerializer):

class Meta:

model = Meizis

fields = "__all__"

在views.py里编写

@api_view(['GET'])

def getlist(request, format=None):

if request.method == 'GET':

meizis = Meizis.objects.values('mid','title').distinct()

# http: // 127.0.0.1:8000 / getlist?limit = 20

# http: // 127.0.0.1:8000 / getlist?limit = 20 & offset = 20

# http: // 127.0.0.1:8000 / getlist?limit = 20 & offset = 40

# 根据url参数 获取分页数据

obj = StandardResultSetPagination()

page_list = obj.paginate_queryset(meizis, request)

# 对数据序列化 普通序列化 显示的只是数据

ser = ListSerialize(instance=page_list, many=True) # 多个many=True # instance:把对象序列化

response = obj.get_paginated_response(ser.data)

return response

@api_view(['GET', 'POST'])

def getlispic(request, format=None):

if request.method == 'GET':

mid = request.GET['mid']

if mid is not None:

# get是用来获取一个对象的,如果需要获取满足条件的一些数据,就要用到filter

meizis = Meizis.objects.filter(mid=mid)

obj = StandardResultSetPagination()

page_list = obj.paginate_queryset(meizis, request)

ser = ListPicSerialize(instance=page_list, many=True)

response = obj.get_paginated_response(ser.data)

return response

else:

return Response(str('请传mid'))

到这里就完成了接口的编写,都是对框架的简单使用,希望对大家有帮助。

GitHub地址,欢迎star

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

python restful api_Python利用Django如何写restful api接口详解相关推荐

  1. python requests库api_python利用requests库进行接口测试的方法详解

    前言 之前介绍了接口测试中需要关注得测试点,现在我们来看看如何进行接口测试,现在接口测试工具有很多种,例如:postman,soapui,jemter等等,对于简单接口而言,或者我们只想调试一下,使用 ...

  2. python 经典脚本文件_Python3.5文件读与写操作经典实例详解

    本文实例讲述了Python3.5文件读与写操作.分享给大家供大家参考,具体如下: 1.文件操作的基本流程: (1)打开文件,得到文件句柄并赋值给一个变量 (2)通过句柄对文件进行操作 (3)关闭文件 ...

  3. ETCD v3 restful api 使用详解

    ETCD v3 restful api 使用详解 网上已经有很多关于v2接口的使用了,类型下面的请求方式,本文就主要讲解v3版本的restful api的使用方式. //V2版本curl http:/ ...

  4. python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...

    文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...

  5. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  6. Django框架学习(一)Django框架安装和项目创建详解

    Django框架学习(一)Django框架安装和项目创建详解 文章目录 Django框架学习(一)Django框架安装和项目创建详解 一.简介 1.1介绍 1.2 URL 1.3.框架原理 二.安装 ...

  7. mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解

    前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...

  8. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  9. php渲染nodejs api,nodejs通过响应回写渲染页面步骤详解

    这次给大家带来nodejs通过响应回写渲染页面步骤详解,nodejs通过响应回写渲染页面的注意事项有哪些,下面就是实战案例,一起来看一下. 我们一般通过node框架提供的api操作页面渲染,如何利用原 ...

最新文章

  1. iis php根目录可以访问子目录不行,wordpress在IIS下伪静态后子目录无法访问的解决方法...
  2. Mac-远程连接Mac
  3. libevent中事件的添加与删除
  4. [FJOI2007]轮状病毒
  5. 国内程序员最容易发音错误的单词集合
  6. maya点线面计数_Maya课时:点线面体选择技巧视频教程_翼狐网
  7. 【教程】如何在标签打印工具TFORMer Designer中自定义布局?
  8. 信息学奥赛C++语言:哥德巴赫猜想
  9. Java实训项目1:GUI学生信息管理系统 - 实训概述
  10. 【opencv】图像处理之相似变换、仿射变换、透视变换
  11. python 开发工具_「干货」推荐一整套 Python 开发工具
  12. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·006【事务】
  13. 码云推出企业 Git 和项目管理现场培训服务
  14. HTML5新标签-Video
  15. IDEA中解决Spring 配置文件未受管束问题,提示:Unmapped Spring configuration files found
  16. mysql 正则表达式 包含中文_sql 查询字段是中文/英文/数字 正则表达式
  17. html header设置语言,HTML header
  18. OPS 数字标牌开放式可插拔规范
  19. 2022PTA天梯赛-全国总决赛试题(个人python解题记录)(更新中)
  20. MATLAB绘图设置

热门文章

  1. leetcode 实现 strStr()
  2. linux服务器 top 查看 内存占用详情
  3. 【CSS】学习笔记3 段落设置
  4. C 语言实例 -求分数数列1/2+2/3+3/5+5/8+...的前n项和
  5. C#LeetCode刷题之#125-验证回文串(Valid Palindrome)
  6. 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwave数据的案例研究
  7. serverless 构建_使用Serverless,StepFunction和StackStorm Exchange构建社区注册应用程序-第2集...
  8. php weize_docs.html
  9. mysql 与oracle 批量插入的 sql 总结
  10. 正则表达式匹配后删除