django预热
课堂笔记:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
day60 2018-04-27 1. 今日内容 1. 概括 1. 98%的时间都是在写例子 帮你理解Django --> 由我们写的例子对比理解Django框架 2. 安装Django 2. 写例子 用户的浏览器(socket客户端) 3. 客户端往服务端发消息 6. 客户端接收消息 7. 关闭 JD的服务器(socket服务端) 1. 启动,监听 2. 等待客户端连接 4. 服务端收消息 5. 服务端回消息 7. 关闭 FTP作业: FTP客户端: PUT,1024.avi,2048 FTP服务端: .split("|") 浏览器和服务端通信都要遵循一个HTTP协议(消息的格式要求). 关于HTTP协议: 1. 浏览器往服务端发的叫 请求(request) 请求的消息格式: 请求方法 路径 HTTP/1.1\r\n k1:v1\r\n k2:v2\r\n \r\n 请求数据 2. 服务端往浏览器发的叫 响应(response) 响应的消息格式: HTTP/1.1 状态码 状态描述符\r\n k1:v1\r\n k2:v2\r\n \r\n 响应正文 <-- html的内容 动态的网页: 本质上都是字符串的替换 字符串替换发生在什么地方: 在服务端替换完再返回给浏览器!!! 总结一下: 1. web框架的本质: socket服务端 与 浏览器的通信 2. socket服务端功能划分: a. 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... b. 根据用户访问不同的路径执行不同的函数 c. 从HTML读取出内容,并且完成字符串的替换 --> jinja2(模板语言) 3. Python中 Web框架的分类: 1. 按上面三个功能划分: 1. 框架自带a,b,c --> Tornado 2. 框架自带b和c,使用第三方的a --> Django 3. 框架自带b,使用第三方的a和c --> Flask 2. 按另一个维度来划分: 1. Django --> 大而全(你做一个网站能用到的它都有) 2. 其他 --> Flask 轻量级 3. 新建Django项目 命令行创建: django-admin startproject mysite pycharm创建: 1. File --> New project --> 左侧选Django --> 右侧填项目路径,并且勾选python.exe 4. 设置Django项目: 1. settings.py 1. 配置HTML文件存放的位置 2. 配置静态文件存放的位置 2. 作业 1. 用Django框架把我们之前写过登录的页面返回给浏览器
不完善的服务端实例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -*- coding: utf-8 -*- ''' 不完善的web服务端实例 ''' import socket # 生成socket对象 sk = socket.socket() # 绑定ip和端口 sk.bind(('127.0.0.1', 8001)) # 监听 sk.listen() # 写一个死循环,一直等待客户端的链接 while 1: # 获取与客户端的链接 conn ,_ = sk.accept() # 接收客户端发来的消息 data = conn.recv(8096) print(data) # 给客户端回复消息 conn.send(b'http/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n') # 想让浏览器再页面上显示出来的内容都是响应正文 conn.send(b'<h1>hello world</h1>') # 关闭 conn.close() sk.close()
浏览器输入 http://127.0.0.1:8001/
根据路径返回不同的页面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -*- coding: utf-8 -*- ''' 不完善的web服务端实例 ''' import socket # 生成socket对象 sk = socket.socket() # 绑定ip和端口 sk.bind(('127.0.0.1', 8001)) # 监听 sk.listen() # 定义处理yimi的函数 def yimi(url): with open('haiyan.html', 'rb') as f: res = f.read() return res # 定义处理yimi的函数 def xiaohei(url): with open('xiaohei.html', 'rb') as f: ret = f.read() return ret # 定义一个处理404的 def f404(url): res = '你访问的地址{}找不到'.format(url) return bytes(res, encoding='utf-8') url_func = [ ('/yimi/', yimi), ('/xiaohei/', xiaohei), ] # 写一个死循环,一直等待客户端的链接 while 1: # 获取与客户端的链接 conn, _ = sk.accept() # 接收客户端发来的消息 data = conn.recv(8096) data_str = str(data, encoding='utf-8') print(data_str) # 用回车换行来切分成数组 l1 = data_str.split('\r\n') l2 = l1[0].split() url = l2[1] print(data) # 给客户端回复消息 conn.send(b'http/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n') # 想让浏览器再页面上显示出来的内容都是响应正文 for i in url_func: if i[0] == url: func = i[1] break else: func = f404 response = func(url) conn.send(response) # 关闭 conn.close()
两个html代码片段:第一个名字是 haiyan.html 第二个名字是:xiaohei.html
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>海燕</title> </head> <body> <h1>web 框架本质是什么鬼002啦啦啦</h1> <p>海燕blablabla</p> <p>恩,其实这里已经是本质了呢</p> </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>小黑</title> </head> <body> <h1>web 框架本质是什么鬼002啦啦啦</h1> <p>这里是小黑</p> <p>恩,其实这里已经是本质了呢</p> </body> </html>
两个正确的url地址:http://127.0.0.1:8001/xiaohei/ http://127.0.0.1:8001/yimi/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1105 day60 结束 学习了,django项目目录的分类, 页面都放在templates下, static文件新设置一个目录,加了配置才能对应起来 BASE_DIR是项目的根目录 urls.py是区分设置根据路径区分网页的地方 cmd 进入到项目目录后 python mange.py runserver 8001 默认是8000端口号 的方式来启动项目