웹 수업 전반전
HTTP 는
Header
와Body
두 부분 으로 구성 되 어 있 으 며,HTTP 요청(Request)을 보 내 는 클 라 이언 트 는 HTTP 요청 을 받 고 정 보 를 되 돌려 주 는 서버 라 고 합 니 다.현재 유행 하 는 HTTP 프로 토 콜 버 전 은 1.1 이 며,물론 HTTP 2 도 있 습 니 다.가장 많이 사용 되 는 두 가지 method 는GET
와POST
입 니 다.PUT
지금도 많이 언급 될 겁 니 다.일반적인 HTTP 헤드 는 다음 과 같 습 니 다.GET / HTTP/1.1
Host: vip.cocode.cc
Connection: close
Content-Type: text/html
GET
우리 가 사용 하 는 방식 을 표시 합 니 다./login
이 사이트 루트 디 렉 터 리 에 있 는 login 데 이 터 를 가 져 오고 있 음 을 표시 합 니 다.HTTP/1.1
사용 하 는 HTTP 프로 토 콜 을 표시 합 니 다.물론 우 리 는 쓸 때 빈 줄 을 위해 이렇게 쓴다.
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.connect
에tuple
를 입력 합 니 다.각각 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 서버 를 구축 할 수 있다.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),먼저 구 덩이 를 파고 나중에 작성 하 는 지식 도 있 습 니 다.GET
와POST
간단 한 차 이 는 하나의 명시 적(주소 표시 줄 에 있 음),하나의 암시 적(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 의 개념 을 나 는 이렇게 이해한다.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)
외부 키 부분 편집 대기...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.