码迷,mamicode.com
首页 > 其他好文 > 详细

Django框架导读

时间:2019-01-03 20:44:24      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:操作   odi   end   rda   用户   请求头   前台   eve   --   

1.web架构

# web应用 架构
# C/S 架构  |  B/S 架构
# client server: 客户端服务器架构,C++
# browser server:浏览器服务器架构,Java、Python

2.http协议

什么是http协议

# HTTP(HyperText Transport Protocol)是超文本传输协议
# 基于TCP/IP协议基础上的应用层协议,底层实现仍为socket
# 基于请求-响应模式:通信一定是从客户端开始,服务器端接收到客户端一定会做出对应响应
# 无状态:协议不对任何一次通信状态和任何数据做保存
# 无连接:一次连接只完成一次请求-响应,请求-响应完毕后会立即断开连接

http工作原理(事务)

# 一次http操作称之为一个事务,工作过程可分为四步
# 1.客户端与服务端建立连接
# 2.客户端发生一个http协议指定格式的请求
# 3.服务器端接收请求后,回应一个http协议指定格式的响应
# 4.客户端将服务器的响应显示展现给用户

请求报文

# 请求行  请求头  请求体
‘‘‘
POST / HTTP/1.1\r\n
Host: 127.0.0.1:8001\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n
\r\n
usr=abc&pwd=123
‘‘‘

响应报文

# 响应行  响应头  响应体
‘‘‘
HTTP/1.1 200 OK\r\n
Content-type:text/html\r\n
\r\n
Login Success
‘‘‘

服务器状态码

# 1打头:消息通知
# 2打头:请求成功
# 3打头:重定向
# 4打头:客户端错误
# 5打头:服务器端错误

3.原生socket

目录结构

01_socket
    -- 01_client.html:前台通过form表单访问后台的页面
    -- 01_login.html:后台测试渲染给前台的登录页面
    -- 01_index.html:后台测试渲染给前台的主面
    -- 01_server.py:后台服务器文件

服务器端

 完成B/S架构项目的设计

# Borwser已经完成
# Server需要手动书写socket,以http协议方式完成响应

import socket

# 设置响应头(包含响应行)
RESP_HEADER = bHTTP/1.1 200 OK\r\nContent-type:text/html;charset=utf-8\r\n\r\n

# 设置服务器socket相关信息
server = socket.socket()
server.bind((localhost, 8808))
server.listen(5)
print("服务: http://localhost:8808")

while True:
    # 获取B以http协议发来的请求
    client, address = server.accept()
    data = client.recv(1024)
    # 数据报文 包含 请求行 请求头 请求体
    print(data)

    # 手动以http协议完成响应
    # 数据报文 包含 响应行 响应头 响应体
    client.send(RESP_HEADER)
    
    # /index => 响应主页
    # /login => 登录页面
    # 错误 => 404
    # 数据data, 字节形式 => 字符串形式
    strData = str(data, encoding=utf-8)
    # 解析请求的数据, 分析得到路由
    my_route = strData.split(\r\n)[0].split( )[1]

    # 后台没有设置的路由,统统以404来处理
    dt = b404
    # 设置的路由返回响应的页面文件
    if my_route == /index:
        with open(02_index.html, rb) as f:
            dt = f.read()
    if my_route == /login:
        with open(02_login.html, rb) as f:
            dt = f.read()

    # /favicon.ico该请求是往后台请求标签图标
    if my_route == /favicon.ico:
        with open(favicon.ico, rb) as f:
            dt = f.read()
    # 响应体
    client.send(dt)
    # 一次循环,代表一次响应,也就是一次事务的完成, 要关闭http请求连接
    client.close()

4.框架演变

目录结构

02_frame
    -- favicon.ico
    -- index.html
    -- manage.py

manage.py

import socket
import pymysql
# 响应头
RESP_HEADER = bHTTP/1.1 200 OK\r\nContent-type:text/html\r\n\r\n

# 请求处理
def index():
    # 以字节方式读取文件
    with open(index.html, rb) as f:
        dt = f.read()
    return dt
def ico():
    with open(favicon.ico, rb) as f:
        dt = f.read()
    return dt
def user():
    # 数据库操作
    conn = pymysql.connect(host=127.0.0.1, port=3306, db=django, user=root, password=root)
    cur = conn.cursor(pymysql.cursors.DictCursor)
    cur.execute(select * from user)
    users = cur.fetchall()
    print(users)
    users = ‘‘‘%d:%s
    %d:%s‘‘‘ % (users[0][id], users[0][name], users[1][id], users[1][name])
    return users.encode(utf-8)

# 设置路由
urls = {
    # 请求路径与请求处理函数一一对应
    /index: index,
    /favicon.ico: ico,
    /user: user
}

# 设置socket
def serve(host, port):
    server = socket.socket()
    server.bind((host, port))
    print(start:http:// + host + : + str(port))
    server.listen(5)
    while True:
        sock, addr = server.accept()
        data = sock.recv(1024)
        data = str(data, encoding=utf-8)
        print(data)
        route = data.split(\r\n)[0].split( )[1]

        resp = b404
        if route in urls:
            resp = urls[route]()

        sock.send(RESP_HEADER)
        sock.send(resp)
        sock.close()

# 启服务
if __name__ == __main__:
    serve(127.0.0.1, 8002)

6.项目演变

目录结构

03_proj
    -- template
        -- index.html
        -- user.html
    favicon.ico
    start.py
    urls.py
    views.py

index.html

<h1>{{ name }}</h1>

user.html

<table border="1">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>password</th>
    </tr>
    {% for user in users%}
    <tr>
        <td>{{user.id}}</td>
        <td>{{user.name}}</td>
        <td>{{user.password}}</td>
    </tr>
    {% endfor %}
</table>

start.py

from wsgiref.simple_server import make_server
from urls import urls


def app(env, response):
    print(env)
    # 设置响应头
    response("200 OK", [(Content-type, text/html)])
    route = env[PATH_INFO]
    print(route)
    data = urls[error]()
    if route in urls:
        data = urls[route]()
    # 返回二进制响应体
    return [data]


if __name__ == __main__:
    server = make_server(127.0.0.1, 8003, app)
    print(start:http://127.0.0.1:8003)
    server.serve_forever()

urls.py

from views import *
urls = {
    /index: index,
    /favicon.ico: ico,
    /user: user,
    error: error
}

views.py

import pymysql
# 利用jinja2来渲染模板,将后台数据传给前台
from jinja2 import Template

def index():
    with open(templates/index.html, r) as f:
        dt = f.read()
    tem = Template(dt)
    resp = tem.render(name=主页)
    return resp.encode(utf-8)

def ico():
    with open(favicon.ico, rb) as f:
        dt = f.read()
    return dt

def user():
    # 数据库操作
    conn = pymysql.connect(host=127.0.0.1, port=3306, db=django, user=root, password=root)
    cur = conn.cursor(pymysql.cursors.DictCursor)
    cur.execute(select * from user)
    users = cur.fetchall()
    print(users)

    with open(templates/user.html, r) as f:
        dt = f.read()
    tem = Template(dt)
    resp = tem.render(users=users)

    return resp.encode(utf-8)

def error():
    return b404

 

Django框架导读

标签:操作   odi   end   rda   用户   请求头   前台   eve   --   

原文地址:https://www.cnblogs.com/lujiachengdelu/p/10216624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!