内容回顾

  python基础
      网路编程
      并发编程
      数据库
      前端 
    osi7层           tcp/ip 5层模型
    应用层
    表示层                 应用层             HTTP  FTP DNS
    会话层
    传输层                 传输层             TCP UDP    
    网路层                 网路层               IP
    数据链路层       数据链路层           ARP
    物理层                 物理层             
    socket   位于应用层和传输层之间的一个抽象层,它是一个接口。
    百度的服务器(socket服务端)
        1. 启动socket
        2. 绑定ip和端口
        3. 监听
        6. 接收数据
        7. 发送数据
        9. 断开连接
    浏览器(socket客户端)
        4. 连接
        5. 发送数据
        8. 接收数据
        9. 断开连接

今日内容

  HTTP协议 

 HTTP 请求/响应的步骤:

1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.luffycity.com。 2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。 3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。 4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求; 5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。 在浏览器地址栏键入URL,按下回车之后会经历以下流程:
浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
释放 TCP连接;
浏览器将该 html 文本并显示内容;
HTTP状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。 状态代码的第一个数字代表当前响应的类型:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误
虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。 URL
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
传送协议。
层级URL标记符号(为[//],固定不变)
访问资源需要的凭证信息(可省略)
服务器。(通常为域名,有时为IP地址)
端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
路径。(以“/”字符区别路径中的每一个目录名称)
查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
片段。以“#”字符为起点
以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中: http,是协议;
www.luffycity.com,是服务器;
80,是服务器上的网络端口号;
/news/index.html,是路径;
?id=250&page=1,是查询。
大多数网页浏览器不要求用户输入网页中“http://”的部分,因为绝大多数网页内容是超文本传输协议文件。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。

创建一个socket服务端

import socket

# 创建一个socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1', 8000)) # 监听
sk.listen() # 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(8096)
print(data)
conn.send(b'HTTP/1.1 200 ok\r\nk1: v1\r\n\r\n')// 状态行
  # 发送数据
conn.send(b'<h1>ok!</h1>')//响应正文
# 断开连接
conn.close()

根据不同路径返回不同的内容

import socket

# 创建一个socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1', 8000)) # 监听
sk.listen() # 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(8096)
data = data.decode('utf-8')
# 获取url
url = data.split()[1] conn.send(b'HTTP/1.1 200 ok\r\nk1: v1\r\n\r\n')
# 根据不同的url返回不容的内容
if url == '/oumei':
conn.send(b'<h1>oumei</h1>')
elif url == '/rihan':
conn.send(b'<h1>rihan</h1>')
else:
# 发送数据
conn.send(b'<h1>not found</h1>')
# 断开连接
conn.close()

根据不同路径返回不同的内容(函数版)

import socket

# 创建一个socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1', 8000)) # 监听
sk.listen() def oumei(url):
ret = 'ourmi - {}'.format(url) return ret.encode('utf-8') def rihan(url):
ret = 'rihan - {}'.format(url) return ret.encode('utf-8') # 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(8096)
data = data.decode('utf-8')
# 获取url
url = data.split()[1] conn.send(b'HTTP/1.1 200 ok\r\nk1: v1\r\n\r\n')
# 根据不同的url返回不容的内容
if url == '/oumei':
ret = oumei(url)
elif url == '/rihan':
ret = rihan(url)
else:
ret = b'<h1>not found</h1>'
# 发送数据
conn.send(ret) # 断开连接
conn.close()

根据不同路径返回不同的内容(函数进阶版)

import socket

# 创建一个socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1', 8000)) # 监听
sk.listen() def oumei(url):
ret = 'ourmi - {}'.format(url) return ret.encode('utf-8') def rihan(url):
ret = 'rihan - {}'.format(url) return ret.encode('utf-8') def guochan(url):
ret = 'guochan - {}'.format(url) return ret.encode('utf-8') # 定义一个地址和函数的对应关系的列表
list1 = [
('/oumei', oumei),
('/rihan', rihan),
('/guochan', guochan),
] # 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(8096)
data = data.decode('utf-8')
# 获取url
url = data.split()[1] conn.send(b'HTTP/1.1 200 ok\r\nk1: v1\r\n\r\n')
# 根据不同的url返回不容的内容
func = None for i in list1:
if url == i[0]:
func = i[1]
break
if func:
ret = func(url)
else:
ret = b'not found' # 发送数据
conn.send(ret) # 断开连接
conn.close()

返回html文件

import socket

# 创建一个socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1', 8000)) # 监听
sk.listen() def oumei(url):
ret = 'ourmi - {}'.format(url) return ret.encode('utf-8') def rihan(url):
ret = 'rihan - {}'.format(url) return ret.encode('utf-8') def guochan(url):
ret = 'guochan - {}'.format(url) return ret.encode('utf-8') def index(url):
with open('index.html', 'rb') as f:
ret = f.read()
return ret # 定义一个地址和函数的对应关系的列表
list1 = [
('/oumei', oumei),
('/rihan', rihan),
('/guochan', guochan),
('/index', index),
] # 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(8096)
data = data.decode('utf-8')
# 获取url
url = data.split()[1] conn.send(b'HTTP/1.1 200 ok\r\nk1: v1\r\n\r\n')
# 根据不同的url返回不容的内容
func = None for i in list1:
if url == i[0]:
func = i[1]
break
if func:
ret = func(url)
else:
ret = b'not found' # 发送数据
conn.send(ret) # 断开连接
conn.close()

返回动态页面

import socket
import time # 创建一个socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1', 8000)) # 监听
sk.listen() def oumei(url):
ret = 'ourmi - {}'.format(url) return ret.encode('utf-8') def rihan(url):
ret = 'rihan - {}'.format(url) return ret.encode('utf-8') def guochan(url):
ret = 'guochan - {}'.format(url) return ret.encode('utf-8') def index(url):
with open('index.html', 'rb') as f:
ret = f.read()
return ret def timer(url):
now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
with open('time.html', 'r', encoding='utf-8') as f:
data = f.read()
data = data.replace('@@time@@', now)
return data.encode('utf-8') # 定义一个地址和函数的对应关系的列表
list1 = [
('/oumei', oumei),
('/rihan', rihan),
('/guochan', guochan),
('/index', index),
('/time', timer),
] # 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(8096)
data = data.decode('utf-8')
# 获取url
url = data.split()[1] conn.send(b'HTTP/1.1 200 ok\r\nk1: v1\r\n\r\n')
# 根据不同的url返回不容的内容
func = None for i in list1:
if url == i[0]:
func = i[1]
break
if func:
ret = func(url)
else:
ret = b'not found' # 发送数据
conn.send(ret) # 断开连接
conn.close()

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。

"""
根据URL中不同的路径返回不同的内容--函数进阶版
返回HTML页面
让网页动态起来
wsgiref模块版
""" from wsgiref.simple_server import make_server # 将返回不同的内容部分封装成函数
def index(url):
# 读取index.html页面的内容
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
# 返回字节数据
return bytes(s, encoding="utf8") def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8") def timer(url):
import time
with open("time.html", "r", encoding="utf8") as f:
s = f.read()
s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))
return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
("/time/", timer),
] def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
return [response, ] if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("我在8090等你哦...")
httpd.serve_forever()

jinjia2模块渲染

from wsgiref.simple_server import make_server
from jinja2 import Template def index(url):
# 读取HTML文件内容
with open("index2.html", "r", encoding="utf8") as f:
data = f.read()
template = Template(data) # 生成模板文件
ret = template.render({'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头']}) # 把数据填充到模板中
return bytes(ret, encoding="utf8") def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
] def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
return [response, ] if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("我在8090等你哦...")
httpd.serve_forever()
django
1. 下载
命令行:
pip install django==1.11.18 -i https://pypi.douban.com/simple/ pycharm 2. 创建项目
命令行:django-admin startproject 项目名
pycharm:
file ——》 new project ——》 项目名 ——》 选择解释器 ——》 create 3. 启动项目
命令行
python manage.py runserver # 127.0.0.1:8000
python manage.py runserver 80 # 127.0.0.1:80
python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80 pycharm:
点击绿三角(切记勿用右键启动文件) 4. 配置:
TEMPLATES 模板配置
'DIRS': [os.path.join(BASE_DIR, 'templates')] DATABASES 数据库 STATIC_URL = '/static/' # 别名 5. 简单使用:
from django.shortcuts import HttpResponse,render def index(request): # return HttpResponse('这是index页面')
return render(request, 'index.html') urlpatterns = [
url(r'^admin/', admin.site.urls), url(r'^index/',index)
]

day58 Pyhton 框架Django 01的更多相关文章

  1. day64 Pyhton 框架Django 07

    day67 内容回顾 视图 1. CBV 定义 from django.views import View class Addpub(View): def get(self,request): sel ...

  2. pyhton框架Django之cookie和session

    一,cookie和session的理解 cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.它保存在浏览器下的某个文 ...

  3. day63 Pyhton 框架Django 06

    内容回顾 1.装饰器 装饰器:是一个闭包函数,在不改变原函数的代码和调用方式的基础上,给原函数增加功能. def wrapper(func): def inner(*args,**kwargs): # ...

  4. day62 Pyhton 框架Django 05

    内容回顾 1.变量 render(request,'模板文件名',{ k1:v1 }) {{ k1 }} {{ list.0 }} {{ dict.key }} {{ dict.keys }} {{ ...

  5. day61 Pyhton 框架Django 04

    内容回顾 1.django处理请求的流程: 1. 在浏览器的地址栏输入地址,回车发get请求: 2. wsgi模块接收请求: 3. 在urls.py文件中匹配地址,找到对应的函数: 4. 执行函数,返 ...

  6. day60 Pyhton 框架Django 03

    day61 内容回顾 1.安装 1. 命令行: pip install django==1.11.18 pip install django==1.11.18 -i 源 2. pycharm sett ...

  7. 跟我一起Django - 01 安装和初始化

    跟我一起Django - 01 安装和初始化 python环境 C:\Python27\Lib\site-packages>python --versionPython 2.7.5 安装setu ...

  8. Django 01 django基本介绍及环境搭建

    Django 01 django基本介绍及环境搭建 #http服务器 #用来接收用户请求,并将请求转发给web应用框架进行处理 #Web应用框架 #处理完请求后在发送给http服务器,http服务器在 ...

  9. python运维开发(十七)----jQuery续(示例)web框架django

    内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...

随机推荐

  1. React和Vue的异同

    Vue和React是时下比较受欢迎的三巨头之二,对Angular不慎了解,就不在赘述. React是由Facebook开发的一个js ui框架,其最大的变化就是VirtualDOM和新语法JSX vu ...

  2. why哥被阿里一道基础面试题给干懵了,一气之下写出万字长文。

    这是why的第 65 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 65 篇.老规矩,先荒腔走板聊聊技术之外的东西. 上面这图是去年的成都马拉松赛道上,摄影师抓拍的我 ...

  3. git 快速入门及常用命令

    身为技术人员,都知道Git是干嘛的.从服务端角度它是代码仓库,可以多人协作.版本控制.高效处理大型或小型项目所有内容:从客户端讲,它能够方便管理本地分支.且与服务端代码的同步,从拉取.合并.提交等等管 ...

  4. [极客大挑战 2019]Secret File wp

    通过标题考虑可能为文件包含漏洞方面 打开网页 从页面并没任何思路,查看源代码 得到有一个跳转到./Archive_room.php的超链接,打开Archive_room.php 中央有一个secret ...

  5. IDEA 2020.2安装破解版教程激活码注册码破解补丁 for Mac Windows Linux-中关村老大爷

    IntelliJ Idea Ultimate 2020.2.x版软件最新安装破解版教程方法,本教程提供Idea Ultimate 2020.2版安装包,破解补丁,激活码,亲测100%完美破解激活,支持 ...

  6. Laravel Model查询结果的3种存储格式内存占用对比

    PHP Laravel框架支持Model查询数据后可以有多种方式返回数据,对新手会造成一些困扰,比如数组Model对象.集合.纯数组 今天从内存占用的角度对比一下3种数据返回方式 按数组Model对象 ...

  7. 趣图:大佬如何解决bug的

    Bug 变 Feature, 这招简直太帅了!   扩展阅读 趣图:我说自己菜 vs 大佬说自己菜 趣图:公司实习生找 Bug 趣图:国内一些大平台的推荐算法 趣图:开发和测试是如何对待代码的 趣图: ...

  8. hexo博客添加gitalk评论系统

      经过了一天的折腾,我终于为自己的博客添加上了评论系统.坦率的讲,为什么网上那么多方案我还要自己写一篇博客,那就是因为他们说的都有bug,所以我要自己总结一下.   我选用的是gitalk评论系统, ...

  9. 极简 Node.js 入门 - 4.3 可读流

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  10. Kafka控制器事件处理全流程分析

    前言 大家好,我是 yes. 这是Kafka源码分析第四篇文章,今天来说说 Kafka控制器,即 Kafka Controller. 源码类的文章在手机上看其实效果很差,这篇文章我分为两部分,第一部分 ...