디렉토리
장고으로 재생 전에
HTTP 프로토콜 (하이퍼 텍스트 프로토콜)
네 가지 특성
TCP / IP 기반의 응용 프로그램 계층 연기 이상
요청의 응답을 바탕으로
요청은 응답으로, 전송되는
상태 비
사용자 상태를 저장하지 않습니다, 한 번도 제공하는 것을 잊었다
연결 없음
예 : 하룻밤 사랑
데이터 형식
요구 포맷
요청의 첫 번째 행 (요청 방법에있어서, 프로토콜 버전, 등)
요청 헤더 (로트 K : V 키 - 값 쌍)
\ R \ 없음
요청 헤더 (요청이 도착하지 않는 경우에만 실시간 데이터는 POST 요청을 보내)
응답 포맷
응답의 첫번째 행
응답 헤더
\ R \ 없음
응답 바디
응답 상태 코드
일부 특정 디지털 데이터를 표현
1XX : 서버는 추가 데이터를 제출할 수 있습니다 처리되는 데이터를 수신
가 2xx : 성공 응답 서버 (200 개 요청을 성공적으로)
3xx의 : 리디렉션
4XX : 요청 오류 (404 (403) 자원을 요청하는 액세스를 거부하는 존재하지 않는)
5XX :( 내부 서버 오류 (500))
신청 방법
요청을받을
데이터를 향한 다른 사람에게
포스트 요청
다른 사람에게 : 제출 된 데이터 (사용자 로그인 등)
순수 손으로 라인과 웹 프레임 워크
- 수동으로 소켓을 작성
- 수동 데이터 처리 형식 HTTP
간단한 C / S 연결
#服务端
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8081))
server.listen(5)
while True:
conn,addr = server.accept()
data = conn.recv(1024)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
print(data)
conn.send(b'hello baby')
conn.close()
프레임 약간 더 복잡한 웹
어떤 클라이언트 요청, 반환 무엇을, 예를 들면 : 클라이언트가 보내는 http://127.0.0.1:8081/index
클라이언트에 다시 서버를index
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8081))
server.listen(5)
while True:
conn,addr = server.accept()
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
data = conn.recv(1024)
print(data)
data = data.decode('utf8')
current_path = data.split('\r\n')[0].split(' ')[1]
print(current_path)
if current_path == '/index':
conn.send(b'index')
#服务端还可以打开html文件,将文件中的东西显示给客户端
# with open(r'index.html', 'rb') as f:
# conn.send(f.read())
else:
conn.send(b'404 error')
conn.close()
기반 wsgiref
인덱스 및 기타 콘텐츠 내부 소켓 연결, 클라이언트가 100 개 가지 요청을 전송 위에 내가 코드를 작성하지 않으려면, 나는 위로하지 전문 롤 100 회 아입니다! 또한 너무 피곤, 그래서 우리는 wsgiref 모듈을 사용하여, 우리는 필요한 코드 wsgiref.py는 해당 파일에 기록 따르고 넣을 수 있습니다, 우리가 더 간단하고 편리하게 작동 할 수 있도록 넣을 수있는 파일은 일.
urls.py 라우팅 기능과 객체 관계형 뷰는 views.py의 뷰 기능 (비즈니스 로직) 넣어 템플릿 템플릿 폴더 (HTML 파일의 무리)
wsgiref.py 파일
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
from views import *
urls = [
('/index',index), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
('/login',login),
('/xxx',xxx),
]
views.py
from urls import urls
def index(env):
return 'index'
def login(env):
return 'login'
def error(env):
return '404 error'
def xxx(env):
return 'xxx'
클라이언트 사전을 통해 서버에 대한 액세스를 얻을 수
여기서 우리는 모듈을 사용할 필요가jinja2
우리는이 모듈을 다운로드 갈 필요가from jinja2 import Template
특정 지식 jinja2
, 링크를 클릭하십시오 https://www.cnblogs.com/yanjiayi098-001/p/11701150.html
wsgiref.py 파일
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
urls = [
('/get_user',get_user), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
]
views.py
def get_user(env):
d = {'name':'jason','pwd':'123','hobby':['read','running','music']}
with open(r'get_user.html','r',encoding='utf-8') as f:
data = f.read()
temp = Template(data) #将data数据传给这个temp,做处理
res = temp.render(user=d) # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
return res
get_user.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
#jinja2模块,可以对字典 进行以下取值,同时这是jinja变量取值 {{ }}的语法
<p>{{ user }}</p>
<p>{{ user.name }}</p>
<p>{{ user['pwd'] }}</p>
<p>{{ user.get('hobby') }}</p>
</body>
</html>
정적 및 동적 페이지
정적 페이지 : 쓰기 죽은 페이지입니다
브라우저 페이지에 대한 반응으로 변경하여 백엔드 데이터 : 동적 페이지
예를 들어 :. 1은 현재 시간을 얻기 위해 프론트 엔드에 다시 끝을 보여줍니다
프론트 엔드 2. 데이터 수집 백엔드 데이터베이스 및 디스플레이
클라이언트는 서버에 액세스하여 현재 시간을 가져옵니다
사용자가 서버에 액세스 그래서 경우, 클라이언트 페이지는 현재 시간이 표시됩니다, 그래서 어떻게 할 수 있나요?
우리는 그가 시간이 페이지에 표시하는 방법 다음, 더 이상 시간이 시간이 포맷을 인코딩하여 다음, HTML로 작성하는 경우 페이지, HTML을 사용하는 것을 알아야한다?
연습 : 우리는 특별히 코드를보고, 문자열 HTML의 특정 문자를 HTML 문자열에 wsgiref에 기초 모듈을 작성 및 교환의 시간이 백 엔드를 얻기 위해 먼저 원하는
wsgiref.py 파일
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
from views import *
urls = [
('/get_time',get_time), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
]
views.py
from urls import *
from datetime import datetime
def get_time():
current_time = datetime.now().strftime('%Y-%m-%d %X')
with open(r'get_time.html','r',encoding='utf-8') as f: #这是一串字符串
data= f.read()
data = data.replace('$$time$$',current_time)
return data
get_time.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
$$time$$
</body>
</html>
클라이언트는 데이터베이스 서버에 액세스하여 데이터를 가져옵니다
이제 데이터베이스 데이터와 방법이 거의 사전처럼 얻을 수 있지만, 안으로 들어가 우리는 데이터베이스의 값을 얻을 수있는 데이터베이스, 링크를 통해 데이터베이스를 구축해야
wsgiref.py 파일
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
urls = [
('/get_db',get_db), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
]
views.py
import pymysql
def get_db(env):
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = 'root',
database = 'day56',
charset = 'utf8',
autocommit = True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from userinfo"
cursor.execute(sql) #提交sql语句,这个出发的是执行的对象并不是一个值
res = cursor.fetchall()
print(res)
with open(r'get_db.html','r',encoding='utf-8') as f:
data = f.read()
temp = Template(data)
ret = temp.render(user_list = res) # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
return ret
get_db.html
여기에서 우리는 전형적인 동적 페이지는 페이지를 구축하기 위해 부트 스트랩을 사용
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="text-center">用户列表</h1>
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>pwd</th>
</tr>
</thead>
<tbody>
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.pwd }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
세 가지 주요 파이썬 웹 프레임 워크
A : 소켓 파트
B : 라우팅 및보기 기능 사이의 대응 관계
C : 템플릿 문법
장고 | 플라스크 | 폭풍 |
---|---|---|
대형 특히 대형 항공 모함과 유사한 기능을 함께 제공 너무 무거운 때때로 |
작지만이 기능을 함께 제공, 특히 낮은 레인저와 유사한 타사 모듈은 장고에 걸쳐 플라스크 경우 모두 추가 할 수 있습니다, 특히 세 번째 모듈로 타사 모듈에 의존 |
비동기 비 차단은 게임 서버를 개발하기 위해 회귀 |
다른 사람의 wsgiref의의 사용 B는 자신에게 쓴 자신을 작성하는 C를 |
다른 사람의 WERKZEUG (기반 wsgiref)의 사용은 B는 나 자신을 쓴 다른 사람 jinja2와 C |
세 전체 쓰기 자신의 |