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 보 기 를 작성 하 는 두 가지 패 키 지 를 제공 합 니 다.
  • @api_view 장식 기,방법 에 기초 한 보기..
  • 4.567917.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 도 저희 인 터 페 이 스 를 호출 할 수 있 습 니 다.


    질문
    우리 의 데 이 터 는 수천 개가 있 는데,함께 돌아 오 는 것 은 매우 불합리 하기 때문에 페이지 를 나 누 어야 한다.물론 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  ( 로 컬 다운로드
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기