python Flask restful api 서비스 구현

node.js 를 백 엔 드 로 사용 하고 있 습 니 다.빅 데이터 범 위 를 점차적으로 섭렵 하려 면 python 을 돌 지 못 할 것 입 니 다.그래서 성숙 한 것 을 python 으로 다시 쓰기 로 결 정 했 습 니 다.하 나 는 방향 을 개척 하고 비 교 를 통 해 python 을 깊이 공부 하기 로 결 정 했 습 니 다.둘째,목표 가 있 고 동력 이 있 으 니 꾸준히 견지 해 나 가 기 를 바란다.
프로젝트 소개
python 언어 로 restful api 서 비 스 를 쓰 고 데이터 베 이 스 는 my sql 을 사용 합 니 다.백 엔 드 마이크로 서비스 만 하고 ORM 의 실현 방식 은 SQL 을 자동 으로 생 성 하 는 방식 으로 이 루어 지기 때문에 경량급 flask 를 웹 프레임 워 크 로 선택 하 였 습 니 다.이렇게 선택 하 는 주요 목적 은 중 소 규모 의 네트워크 응용 을 대상 으로 관계 데이터 뱅 크 의 여러 가지 장점 을 충분히 이용 하여 풍부 한 현대 인터넷 응용 을 실현 하 는 것 이다.
REST 의 여섯 가지 특성:
  • Client-server:서버 쪽 과 클 라 이언 트 가 분 리 됩 니 다.
  • Stateless(무상 태):클 라 이언 트 가 요청 할 때마다 완전한 정 보 를 포함해 야 합 니 다.다시 말 하면 모든 요청 은 독립 적 입 니 다.
  • Cacheable(캐 시 가능):서버 에서 캐 시 할 수 있 는 요청 을 지정 해 야 합 니 다.
  • Layered System(계층 구조):서버 측 과 클 라 이언 트 의 통신 은 반드시 표준화 되 어야 하 며 서버 의 변경 은 클 라 이언 트 에 영향 을 주지 않 습 니 다.
  • Uniform Interface(통일 인터페이스):클 라 이언 트 와 서버 의 통신 방법 은 반드시 통일 되 어야 합 니 다.
  • Code on demand(필요 에 따라 코드 를 실행 합 니까?):서버 쪽 에서 컨 텍스트 에서 코드 나 스 크 립 트 를 실행 할 수 있 습 니 다
  • restful api
    restful api 의 개념 은 소개 하지 않 겠 습 니 다.여기 서 우리 가 협의 형식 을 실현 하 는 것 을 말 해 보 자.
    
    [GET]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen     
    [POST]/rs/user[/{id}]     
    [PUT]/rs/user/{id}
    [DELETE]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen
    설명:
  • rs 는 자원 표지 이다.
  • 2 절,user 는 데이터베이스 테이블 이름 으로 분 석 됩 니 다.
  • 조회 시 id 가 비어 있 거나 0 일 때 id 는 무시 되 고 목록 조회 입 니 다.
  • 새로 만 들 고 수정 하면 form 폼 을 받 는 것 을 제외 하고 url 의 id 매개 변수 도 매개 변수 집합 에 합 쳐 집 니 다.
  • 같은 검색 어 를 삭제 합 니 다.
  • flask 에 정규 표현 식 지원
    flask 기본 루트 는 정규 표현 식 을 지원 하지 않 습 니 다.완전한 URL 을 캡 처 해서 스스로 해석 해 야 합 니 다.조 회 를 통 해 다음 단계 에 따라 작업 을 쉽게 수행 할 수 있 습 니 다.
  • werkzeug 라 이브 러 리 사용:from werkzeug.routing import BaseConverter
  • 정의 변환기:
  • 
    class RegexConverter(BaseConverter):
    
      def __init__(self, map, *args):
        self.map = map
        self.regex = args[0]
    
  • 등록 변환기:app.urlmap.converters['regex'] = RegexConverter
  • url 을 정규 로 캡 처 합 니 다:@app.route('/rs/', methods=['PUT', 'DELETE', 'POST', 'GET'])
  • 몇 가지 의문:
  • 정규(.*)이론 적 으로 리 턴 을 제외 한 모든 문자 와 일치 해 야 하지만 왜 여기에 물음표(?)를 식별 하지 못 하 는 지 모르겠다(?)4567918)
  • 저 는 request.data 로 폼 데 이 터 를 찾 습 니 다.왜 request.form 에서 찾 을 수 없 습 니까?
  • '/rs/'후 역 슬 래 쉬('/rs//),request.data 는 데 이 터 를 찾 을 수 없습니다.왜 요?4567918)
    json 데이터 분석
    json 데 이 터 를 분석 하 는 것 은 쉽 지만 클 라 이언 트 가 보 낸 데 이 터 를 검증 해 야 합 니 다.다음은 이상 처리 로 한 번 만 분석 하 는 해결 방안 입 니 다.
    
    def check_json_format(raw_msg):
      try:
        js = json.loads(raw_msg, encoding='utf-8')
      except ValueError:
        return False, {}
      return True, js
    URL 분석
    정 해진 프로 토 콜 에 따라 URL 을 분석 하고 표 이름 을 추출 하여 sql 조합 매개 변수 집합 을 생 성 합 니 다.
    
    @app.route('/rs/<regex(".*"):query_url>', methods=['PUT', 'DELETE', 'POST', 'GET'])
    def rs(query_url):
      (flag, params) = check_json_format(request.data)
    
      urls = query_url.split('/')
      url_len = len(urls)
      if url_len < 1 or url_len > 2 and url_len % 2 == 1:
        return "The params is wrong."
    
      ps = {}
      for i, al in enumerate(urls):
        if i == 0:
          table = al
        elif i == 1:
          idd = al
        elif i > 1 and i % 2 == 0:
          tmp = al
        else:
          ps[tmp] = al
    
      ps['table'] = table
      if url_len > 1:
        ps['id'] = idd
      if request.method == 'POST' or request.method == 'PUT':
        params = dict(params, **{'table': ps.get('table'), 'id': ps.get('id')})
      if request.method == 'GET' or request.method == 'DELETE':
        params = ps
      return jsonify(params)
    
    전체 코드
    
    git clone https://github.com/zhoutk/pyrest.git
    cd rest
    export FLASK_APP=index.py
    flask run
    작은 매듭
    오늘 은 fllask 를 이용 하여 웹 기반 구 조 를 완 성 했 습 니 다.URL 을 정확하게 분석 하고 클 라 이언 트 가 제출 한 데 이 터 를 추출 할 수 있 으 며 요청 한 방식 에 따라 우리 가 필요 로 하 는 데 이 터 를 조합 할 수 있 습 니 다.여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
  • 좋은 웹페이지 즐겨찾기