Django框架导读
Posted lujiachengdelu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架导读相关的知识,希望对你有一定的参考价值。
1.web架构
# web应用 架构 # C/S 架构 | B/S 架构 # client server: 客户端服务器架构,C++ # browser server:浏览器服务器架构,Java、Python
# HTTP(HyperText Transport Protocol)是超文本传输协议 # 基于TCP/IP协议基础上的应用层协议,底层实现仍为socket # 基于请求-响应模式:通信一定是从客户端开始,服务器端接收到客户端一定会做出对应响应 # 无状态:协议不对任何一次通信状态和任何数据做保存 # 无连接:一次连接只完成一次请求-响应,请求-响应完毕后会立即断开连接
http工作原理(事务)
# 一次http操作称之为一个事务,工作过程可分为四步 # 1.客户端与服务端建立连接 # 2.客户端发生一个http协议指定格式的请求 # 3.服务器端接收请求后,回应一个http协议指定格式的响应 # 4.客户端将服务器的响应显示展现给用户
请求报文
# 请求行 请求头 请求体 ‘‘‘ POST / HTTP/1.1 Host: 127.0.0.1:8001 Connection: keep-alive Upgrade-Insecure-Requests: 1 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 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 usr=abc&pwd=123 ‘‘‘
响应报文
# 响应行 响应头 响应体 ‘‘‘ HTTP/1.1 200 OK Content-type:text/html 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 = b‘HTTP/1.1 200 OK Content-type:text/html;charset=utf-8 ‘ # 设置服务器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(‘ ‘)[0].split(‘ ‘)[1] # 后台没有设置的路由,统统以404来处理 dt = b‘404‘ # 设置的路由返回响应的页面文件 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 = b‘HTTP/1.1 200 OK Content-type:text/html ‘ # 请求处理 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(‘ ‘)[0].split(‘ ‘)[1] resp = b‘404‘ 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)
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 b‘404‘
以上是关于Django框架导读的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django Summernote 中显示编程片段的代码块?
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段