1. http协议
请求的格式(request ---浏览器向服务器发送的消息)
请求方式: URL HTTP/1.1\r\n
K1:V1\r\n
K2:V2\r\n
     \r\n
请求正文/请求体(get请求没有请求数据)


    响应的格式(response  ---服务端回复给浏览器的消息)
     HTTP/1.1 200 OK  # response headers 响应头


        HTTP/1.1 状态码 状态描述\r\n
        K1:V1\r\n
K2:V2\r\n
     \r\n
响应数据(响应体) -HTML    状态码:
    1XX
    2XX 200
    3XX 301 302  重定向
    4xx 请求的问题
    5xx 服务器的问题   url
    http://www.cnblogs.com/majj?k1=v1&k2=v2 8种请求方式:
GET
POST
HEAD
PUT
DELETE
TRACE
OPTIONS
CONNECT
发请求到接收响应的流程:
. 在浏览器的地址栏中输入url,回车. 发送一个遵循HTTP协议的GET请求.
. 服务器接收到请求,获取到路径.根据路径执行对应的函数,获取想要的内容.
. 读取到一个HTML的文本,替换文本中的内容,生成一个新的HTML文本.
. 回复一个遵循HTTP协议的响应.
. 浏览器接收到响应,拿响应中的响应体,进行渲染.
 
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\n\r\n')
# 返回数据
conn.send(b'<h1>ok</h1>') # 关闭连接
conn.close()

socket服务端

浏览器端 输入地址 127.0.0.1:8000 

2. web 框架(socket服务端)
功能:
a. socket 收发消息
b. 根据不同的路径返回不同的内容
c. 可以返回动态页面(字符串替换 -模板的渲染) jinja2 分类:
Django 实现b,c功能
flask 实现b功能
tornado 实现a,b,c功能 另类分类:
Django 大,重量级
其他 轻量级
import socket

# 创建socket对象
server = socket.socket()
# 绑定IP和端口
server.bind(('127.0.0.1', 8000))
# 监听
server.listen() while 1:
# 等待连接
conn, addr = server.accept()
# 接收数据
data = conn.recv(1024)
data = data.decode('utf-8')
# print(data)
url = data.split()[1]
print(url) # 返回状态行
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') if url == '/oumei':
conn.send(b'<h1>oumei</h1>')
elif url == '/rihan':
conn.send(b'<h1>rihan</h1>')
else:
conn.send(b'<h1>404 not found</h1>') # 关闭连接
conn.close()

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

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8000))
server.listen() def oumei(url):
ret = 'oumei -{}'.format(url) return ret.encode('utf-8') def rihan(url):
ret = 'rihan -{}'.format(url) return ret.encode('utf-8') while 1:
conn, addr = server.accept()
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
print(url) conn.send(b'HTTP/1.1 200 OK\r\n\r\n') if url == '/oumei':
ret = oumei(url)
elif url == '/rihan':
ret = rihan(url)
else:
ret = b'404 not found' conn.send(ret) conn.close()

函数版

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8000))
server.listen() def oumei(url):
ret = 'oumei -{}'.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') list = [
('/oumei', oumei),
('/rihan', rihan),
('/guochan', guochan)
] while 1:
conn, addr = server.accept()
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
print(url) conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
func = None
for el in list:
if el[0] == url:
func = el[1]
break if func:
ret = func(url)
else:
ret = b'404 not found' conn.send(ret)
conn.close()

函数进阶版

import socket

server = socket.socket()

server.bind(('127.0.0.1', 8000))

server.listen()

def oumei(url):
ret = 'oumei - {}'.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 list = [
('/oumei', oumei),
('/rihan', rihan),
('/guochan', guochan),
('/index', index),
] while True:
# 等待连接
conn, addr = server.accept()
# 接收数据
data = conn.recv(8096)
data = data.decode('utf-8')
url = data.split()[1]
print(url) # 返回状态行
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
func = None
for i in list:
if i[0] == url:
func = i[1]
break if func:
ret = func(url)
else:
ret = b'404 not found' conn.send(ret) # 关闭连接
conn.close()

返回HTML页面01

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
div{
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
background-color: greenyellow;
margin: 0 auto;
}
</style>
</head>
<body>
<div><b>这里是index</b></div>
</body>
</html>

返回HTML页面02

import time
import socket server = socket.socket()
server.bind(('0.0.0.0', 8000)) server.listen() def oumei(url):
ret = 'oumei - {}'.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')
with open('time.html', 'r', encoding='utf-8') as f:
data = f.read()
data = data.replace('@@time@@', now) return data.encode('utf-8') lst = [
('/oumei', oumei),
('/rihan', rihan),
('/guochan', guochan),
('/index', index),
('/time', timer),
] while 1:
conn,addr = server.accept()
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
print(url) conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
func = None
for i in lst:
if i[0] == url:
func = i[1]
break if func:
ret = func(url)
else:
ret = b'404 not found' conn.send(ret) # 关闭连接
conn.close()

返回动态页面01

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>当前时间是: @@time@@ </h1>
</body>
</html>

返回动态页面02

"""
根据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()

wsgi

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': 'wusir', '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()

jinja2

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<h1>姓名:{{name}} </h1>
<h1>爱好:</h1>
<ul>
{% for hobby in hobby_list %}
<li>{{hobby}}</li>
{% endfor %}
</ul>
</body>
</html>

html2


3. Django
1. 下载
1. 命令行
pip install django==1.11.16
按住shift 右击文件夹

        2. 创建项目
      django-admin startproject 项目名 3. 启动项目
cd 切换到项目目录下 manage.py
pyhton .\manage.py runserver


            # 默认端口号127.0.0.1:8000
pyhton .\manage.py runserver 80 把端口号改成80
pyhton .\manage.py runserver 0.0.0.0:80 把IP改成0.0.0.0,端口号改成80 2. pycharm 启动项目



4. 配置:
TEMPLATES
'DIRS': [os.path.join(BASE_DIR, 'templates'] # HTML文件要存放的地方 DATABASES 数据库, 可以配多个数据库 静态文件的配置
STATIC_URL = '/static/' # 别名
  
  # 自己配置, 列表里写静态文件的路径, 可以配置多个路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
什么是静态文件?
# Static files (CSS, JavaScript, Images)  等不常发生变化的文件


												

Day057--django的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  3. django server之间通过remote user 相互调用

    首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  7. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  8. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  9. Django

    一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...

  10. Django admin定制化,User字段扩展[原创]

    前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...

随机推荐

  1. javascript排序算法-选择排序

    选择排序 概念:选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推. 复杂度: O(n^2) 代码实现 var swap = function ...

  2. flex 增长与收缩

    flex:auto  将增长值与收缩值设置为1,基本大小为 auto . flex:none. 将增长值与收缩值设置为0,基本大小为 auto .也就是固定大小. 增长: 基本大小 + 额外空间 *( ...

  3. KsUML 免费的类图建模工具

    最近基于SharpDevelop和NClass两个开源软件,开发了一个免费的类图建模工具,详情请访问 www.TimeGIS.com KsUML类图建模工具是一个用来给软件开发人员使用的一种UML类图 ...

  4. 【设计模式】原型模式 Pototype Pattern

    前面讲了创建一个对象实例的方法单例模式Singleton Pattern, 创造多个产品的工厂模式(简单工厂模式 Simple Factory Pattern, 工厂方法模式 FactoryMothe ...

  5. Docker-通过docker-maven-plugin插件实现docker镜像构建并自动发布到远程docker服务器

    我们知道,docker能实现应用打包隔离,实现快速部署和迁移.如果我们开发应用使用了spring cloud + spring boot架构,那么,通过docker-maven-plugin实现快速构 ...

  6. C# Base64方式的编码与解码

    编码与解码方法: ///编码 public static string EncodeBase64(string code_type, string code) { string encode = &q ...

  7. 【java学习】实践中总结--持续更新中

    目录: 一些定义 配置环境 相关语法 1.一些定义 java中DO的含义: https://blog.csdn.net/canot/article/details/51698047 DAO 中包含了各 ...

  8. angularjs兼容thickbox 插件

    ThickBox是一个基于JQuery类库的扩展,它能在浏览器界面上显示非常棒的UI框, 它可以显示单图片,多图片,ajax请求内容或链接内容.ThickBox 是用超轻量级的 jQuery 库 编写 ...

  9. C#:往数据库插入/更新时候关于NUll空值的处理

    前几天遇到一个问题,找了好久才找到解决办法.不过也很开心,终于解决了. 问题:前端当我数据为空的时候不赋值,传到后台也为空的时候(注意:是Null不是""),SqlCommand对 ...

  10. day 25 面向对象之接口、抽象类、多态、异常处理、反射、断言

    复习 '''继承​1.父类:在类后()中写父类们class A:passclass B:passclass C(A, B):pass​2.属性查找顺序:自己 -> ()左侧的父类 -> 依 ...