웹 수업 전반전

HTTP, Socket, TCP/IP
HTTP 는HeaderBody두 부분 으로 구성 되 어 있 으 며,HTTP 요청(Request)을 보 내 는 클 라 이언 트 는 HTTP 요청 을 받 고 정 보 를 되 돌려 주 는 서버 라 고 합 니 다.현재 유행 하 는 HTTP 프로 토 콜 버 전 은 1.1 이 며,물론 HTTP 2 도 있 습 니 다.가장 많이 사용 되 는 두 가지 method 는GETPOST입 니 다.PUT지금도 많이 언급 될 겁 니 다.일반적인 HTTP 헤드 는 다음 과 같 습 니 다.
GET / HTTP/1.1
Host: vip.cocode.cc
Connection: close
Content-Type: text/html
GET우리 가 사용 하 는 방식 을 표시 합 니 다./login이 사이트 루트 디 렉 터 리 에 있 는 login 데 이 터 를 가 져 오고 있 음 을 표시 합 니 다.HTTP/1.1사용 하 는 HTTP 프로 토 콜 을 표시 합 니 다.
물론 우 리 는 쓸 때 빈 줄 을 위해 이렇게 쓴다.
  • http_client.py
  • import socket
    
    #    Socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    #     
    s.connect(('vip.cocode.cc', 80))
    
    #    HTTP   
    s.send(b'GET /login HTTP/1.1\r
    Host:vip.cocode.cc\r
    Connection:close\r
    Content-Type:text/html\r
    \r
    ') # buffer = [] while True: d = s.recv(1024) if d: buffer.append(d) else: break data = b''.join(buffer) s.close() print(data)

    Socket 은 높 은 명사 로 구체 적 으로 는 설명 하지 않 습 니 다.Socket 을 만 드 는 것 은 하나의 세트 입 니 다.첫 번 째 매개 변 수 는socket.AF_INET여기 서 우 리 는 IPv 4 모드 를 사용 하고 두 번 째 매개 변 수 는socket.SOCK_STREAM여기 서 TCP 프로 토 콜 을 사용 한 다 는 뜻 입 니 다.연결 을 만 들 고s.connecttuple를 입력 합 니 다.각각 address 와 port 두 개의 매개 변 수 는 보통 80 입 니 다.HTTP 는 기본 값 이 80 이 고 세트 이기 때 문 입 니 다.연결 을 만 든 후,우 리 는 server 에 HTTP 요청 을 합 니 다.\r
    \r
    \r
    ,규정된 세트 를 주의해 야 합 니 다.이것 을 따 르 지 않 으 면,이것 은 표준 에 맞 는 HTTP 요청 이 아니 므 로,당신 이 원 하 는 첫 페이지 의 내용 을 얻 을 수 없습니다.만약 문제 가 없다 면,우 리 는 서버 가 돌아 온 데 이 터 를 받 을 수 있 을 것 이다.데 이 터 를 받 는 이 코드 는s.recv(1024)매번 최대 1024 바이트 의 데 이 터 를 받 은 다음while순환 에 끼 워 넣 으 면s.recv()빈 데 이 터 를 되 돌려 주 고 데이터 가 모두 받 아들 여 졌 음 을 증명 합 니 다.이 럴 때 순환 을 끝 낼 수 있 습 니 다.s.close()socket 을 닫 는 데 사용 되 며 서버 와 의 통신 이 끝 납 니 다.마지막 으로 돌아 온 데 이 터 는 다음 과 같 습 니 다.
    b'HTTP/1.1 200 OK\r
    Date: Fri, 01 Jul 2016 04:58:34 GMT\r
    Server: Apache/2.4.7 (Ubuntu)\r
    Content-Length: 1181\r
    Vary: Accept-Encoding\r
    Connection: close\r
    Content-Type: text/html; charset=utf-8\r
    \r




    \xe7\x99\xbb\xe5\xbd\x95\xe9\xa1\xb5\xe9\x9d\xa2





      \xe7\x99\xbb\xe5\xbd\x95

























    '

    복잡 해 보이 지만 HTTP 헤드 데이터 도 포함 되 어 있 고 웹 페이지(Body)데이터 도 포함 되 어 있 으 며 코드 로 분리 할 수 있 습 니 다.
    header, body = data.split('\r
    \r
    ') print(header.decode('utf-8'), body.decode('utf-8'))

    마지막 으로 우 리 는 비교적 직관 적 인 데 이 터 를 얻 었 다.
    # HTTP  
    HTTP/1.1 200 OK
    Date: Fri, 01 Jul 2016 05:07:06 GMT
    Server: Apache/2.4.7 (Ubuntu)
    Content-Length: 1181
    Vary: Accept-Encoding
    Connection: close
    Content-Type: text/html; charset=utf-8
    
    # Body
    
    
    
        
            
        
    
    
        





    물론,우 리 는socket라 이브 러 리 를 이용 하여 HTTP 서버 를 구축 할 수 있다.
  • http_server.py
  • import socket
    
    
    def index():
        html = b'HTTP/1.x 200 OK\r
    Content-Type: text/html\r
    \r

    Hello World

    ' return html host = '' port = 3000 s = socket.socket() s.bind((host, port)) s.listen(5) while True: s.listen(3) connection, address = s.accept() request = connection.recv(1024) request = request.decode('utf-8') connection.sendall(response) connection.close()

    그것 을 실행 하면 계속 감청 상태 에 있 을 것 이다.그리고 이전의 클 라 이언 트 코드 를 수정 해서 우리 에 게 이 자신 이 만 든 서버 를 주면 OK 입 니 다.손 으로 쓴 경로,손 으로 쓴 해석GET검색 문자열(query string),먼저 구 덩이 를 파고 나중에 작성 하 는 지식 도 있 습 니 다.GETPOST간단 한 차 이 는 하나의 명시 적(주소 표시 줄 에 있 음),하나의 암시 적(Body 에 있 음)이기 때문에HTTPS프로 토 콜 협조POST방법 으로 프라이버시 데 이 터 를 전송 하면 안전 을 보장 할 수 있 습 니 다.
    Cookie
    서버 에서 당신 의 신분 을 확인 하 는 것 은 쿠키 를 이용 하 는 것 입 니 다.예 를 들 어 로그 인 상 태 를 검증 하 는 것 입 니 다.서버 에 사용자 이름 비밀 번 호 를 제출 했 습 니 다.OK 를 검 증 했 습 니 다.쿠키 를 줄 것 입 니 다.나중에 시작 한 HTTP 요청 에서 인증 을 받 습 니 다.따라서 Cookie 는 명문(예 를 들 어username=arischow,이 안전성 이 너무 떨 어 집 니 다)이 어 서 는 안 됩 니 다.HTTP 요청 헤더 가 즐겨 쓰 는 대로 쓸 수 있 기 때 문 입 니 다.(이전 코드 에 손 으로 쓴 HTTP 요청 헤더)명문 이 라 고 가정 하면 상대방 이 Cookie 를username=admin로 바 꾸 면 관리자 의 신분 을 위조 하여 나 쁜 짓 을 할 수 있 습 니 다.이것 은 안전 문제 가 발생 할 수 있 습 니 다.간단 한 해결 방법 은 불규칙 적 이 고 강도 가 높 은 무 작위 문 자 를 쿠키 로 만들어 불규칙 적 으로 따라 갈 수 있 도록 하 는 것 이다.
    데이터베이스
    사실 데이터 도 텍스트 파일 로 저장 할 수 있 습 니 다.
    Aris, 123456, [email protected]
    Alex, 566555, [email protected]
    Susan, 455721, [email protected] 
    

    데이터 베 이 스 는 데 이 터 를 저장 하 는 것 이 더욱 조리 가 있 고 특정한 부분 을 조회 하고 호출 하 는 데 더욱 편리 하 다.지식 포인트:SQL 의 CRUD
    Flask
    위 에 나 열 된 지식 포 인 트 를 알 아 보고 Flask 를 보 세 요.Flask 를 사용 하면 위의 많은 똥 을 파 는 일이 간단 해 집 니 다.구체 적 으로render_template, url_for, flash, request, redirect그런 것 은 할 말 이 없습니다.MVC 의 개념 을 나 는 이렇게 이해한다.
  • Model-데이터 요청/조작(현재 사용 되 고 있 는 Flask-SQLalchemy,Flask-WTforms 의 물건 은 모두 여기에 두 겠 습 니 다)
  • View-보기 전시/조작(View 에 데 이 터 를 전송 하고 간단 한 판단 을 써 서 보기 가 어떻게 표시 되 는 지 결정 합 니 다.예 를 들 어 사용자 가 시스템 에 로그 인 했 을 때 네 비게 이 션 표시 줄 에'로그 인'이라는 단 추 를 표시 할 수 없습니다.이것 은 Session 을 View 에 전송 할 수 있 습 니 다.그리고 View 는 Session 의 값 에 따라 로그 인 단 추 를 보 여 줘 야 하 는 지,로그 인 단 추 를 보 여 줘 야 하 는 지 판단 할 수 있 습 니 다)
  • Controller-이벤트 바 인 딩(경로 구축,언제 무엇 을 호출 해 야 하 는 지 판단 합 니 다.예 를 들 어 사용자 가 등록 한 계 정 비밀번호 메 일 은 형식/길이 가 정확 한 지 판단 해 야 합 니 다.이때 데이터 작업 과 관련 되 어 Controller 는 Model 안의 한 함 수 를 호출 합 니 다.이 함수 가 값 을 되 돌려 준 후에...Controller 는 값 에 따라 다음 단 계 를 결정 합 니 다:규정 에 맞 으 면 Model 안의 함 수 를 호출 하여 데 이 터 를 저장 합 니 다.규정 에 맞지 않 으 면 오 류 를 되 돌려 줍 니 다...)
  • SQLAlchemy
    Flask 에서 우 리 는 SQLAlchemy 를 사용 할 것 입 니 다.API 인 터 페 이 스 를 만 들 었 습 니 다.이 인 터 페 이 스 를 사용 하면 우 리 는 나체로 SQL 문 구 를 쓰 지 않 습 니 다.난점:대응 관 계 는 어 려 운 점 이 고 비교적 자주 사용 하 는 것 은 한 쌍 의 다 관계 이다.만약 에 우리 가 두 장의 표를 가지 고 있다 고 가정 하면 하 나 는users이 고 안의 필드 는id, username, password이 며,또 하 나 는posts입 니 다.안의 필드 는id, title, content입 니 다.우 리 는 이 두 장의 표를 연결 해 야 합 니 다.한 블 로그 게시 물 은 한 명의 작가(사용자)만 있 고,한 명의 작가(사용자)는 많은 블 로그 게시 물 을 가 질 수 있 습 니 다.
    # ...
    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String, unique=True)
        password = db.Column(db.String, nullable=False)
    
        #       
        posts = db.relationship('Post', backref='user')
    
        def __repr__(self):
            return u''.format(self.username)
    
    class Post(db.Model):
        __tablename__ = 'posts'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String, nullable=False)
        content = db.Column(db.Text)
    
        #       
        user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    
        def __repr__(self):
            return u''.format(self.title)
    

    외부 키 부분 편집 대기...

    좋은 웹페이지 즐겨찾기