장고으로 재생 전에

장고으로 재생 전에

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
세 전체 쓰기 자신의

추천

출처www.cnblogs.com/yanjiayi098-001/p/11701253.html