Python 은 Django 를 이용 하여 restful api 인 터 페 이 스 를 어떻게 쓰 는 지 상세 하 게 설명 합 니 다.
파 이 썬 으로 인 터 페 이 스 를 어떻게 쓰 는 지,먼저 데이터 가 있어 야 합 니 다.우리 가 사이트 에서 오 를 수 있 는 데 이 터 를 사용 할 수 있 습 니 다.지난 글 에서 파 이 썬 파충 류 를 어떻게 사용 하 는 지,관심 있 는 것 은 볼 수 있 습 니 다https://www.jb51.net/article/141661.htm
대량의 데 이 터 를 데이터베이스 에 저장 하 는 것 이 비교적 편리 하 다.내 가 사용 하 는 pymsql,pymsql 은 Python 에서 MySQL 을 조작 하 는 모듈 로 그 사용 방법 은 MySQL db 와 거의 같다.그러나 현재 python 3.x 에서 PyMySQL 은 MySQL db 를 대체 했다.
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.웹 프로젝트 만 들 기우리 의 파충 류 를 운행 하면 곧 데이터베이스 표 에 데이터 가 있 을 것 이다.
그리고 인 터 페 이 스 를 쓰기 시작 했다.저 는 Django+rest 를 통 해서...프레임 워 크 에서 썼어 요.
Django 는 Python 으로 개발 한 무료 오픈 소스 웹 프레임 워 크 로 고성능,우아 한 사 이 트 를 신속하게 구축 할 수 있 습 니 다.Django 에 서 는 개발 사이트 에서 자주 사용 하 는 모듈 을 제공 합 니 다.흔히 볼 수 있 는 코드 를 모두 써 서 중복 되 는 코드 를 줄 입 니 다.
Django 디 렉 터 리 구조
urls.py
사이트 입구,대응 하 는 views.py 의 함수(또는 generic 류)와 관련 되 어 있 으 며,사이트 에 접근 하면 함수 에 대응 합 니 다.
views.py
사용자 가 보 낸 요청 을 처리 합 니 다.urls.py 에서 대응 합 니 다.templates 의 웹 페이지 를 렌 더 링 하면 로그 인 한 사용자 이름,사용자 가 요청 한 데 이 터 를 웹 페이지 로 출력 할 수 있 습 니 다.
models.py
데이터베이스 작업 과 관련 하여 데 이 터 를 저장 하거나 읽 을 때 이것 을 사용 합 니 다.물론 데이터 베 이 스 를 사용 하지 못 할 때 사용 하지 않 아 도 됩 니 다.
forms.py
폼,사용자 가 브 라 우 저 에 데 이 터 를 입력 하여 제출 하고 데이터 에 대한 검증 작업 과 입력 상자 의 생 성 등 작업 을 할 수 있 습 니 다.물론 사용 하지 않 아 도 됩 니 다.
템 플 릿 폴 더
views.py 의 함수 가 templates 의 Html 템 플 릿 을 렌 더 링 하여 동적 콘 텐 츠 를 얻 은 웹 페이지 는 당연히 캐 시 로 속 도 를 높 일 수 있 습 니 다.
admin.py
백 스테이지,아주 적은 코드 로 강력 한 백 스테이지 를 가 질 수 있 습 니 다.
settings.py
Django 의 설정,설정 파일,예 를 들 어 DEBUG 의 스위치,정적 파일 의 위치 등.
장고
1)django 프로젝트 새로 만 들 기
django-admin.py startproject project_name
2)새 앱
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.쓰기 인터페이스인터페이스 사용 restframework,rest_framework 는 Django 기반 REST 프레임 워 크 로 웹 API 를 구축 하 는 강력 하고 유연 한 도구 패키지 입 니 다.
쓰기 인터페이스 3 단계 완성:데이터베이스 연결,데이터 추출,데이터 출력
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 클래스 만 들 기직렬 화 와 반 직렬 화 경 로 를 제공 하여 이 를'제 이 슨'과 같은 표현 형식 으로 전환 시 킬 수 있다.우 리 는 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 보 기 를 작성 하 는 두 가지 패 키 지 를 제공 합 니 다.
형식 접 두 사 를 사용 하여 지정 한 형식 을 명확 하 게 가리 키 려 면 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 도 저희 인 터 페 이 스 를 호출 할 수 있 습 니 다.
질문
우리 의 데 이 터 는 수천 개가 있 는데,함께 돌아 오 는 것 은 매우 불합리 하기 때문에 페이지 를 나 누 어야 한다.물론 restframework 프레임 워 크 는 이 기능 을 제공 합 니 다.post 요청 은 지원 되 지 않 습 니 다.데이터 베 이 스 를 찾 거나 슬라이스 를 해서 되 돌려 야 합 니 다.rest프레임 워 크 는 어떻게 페이지 를 나 누 었 습 니까?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 주소,환영 스타
파충류 프로젝트:https://github.com/peiniwan/CreeperTest(로 컬 다운로드)
웹 프로젝트:https://github.com/peiniwan/mysite(로 컬 다운로드)
APP 프로젝트:https://github.com/peiniwan/Ganhuo ( 로 컬 다운로드 )
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.