一.socket服务器
import socket sk=socket.socket() sk.bind(("127.0.0.1",8890)) sk.listen() while True: conn, addr = sk.accept() data=conn.recv(8800) print(data.decode("utf-8")) conn.send(b'HTTP/1.1 200 OK ') conn.send(b'ok') conn.close() sk.close()
二.根据不同路径返回不同内容
import socket sk=socket.socket() sk.bind(("127.0.0.1",8877)) sk.listen() conn,addr = sk.accept() # 接收数据data data=conn.recv(8800) # 取到路径 url=data.decode('utf-8').split()[1] print(url) conn.send(b'HTTP/1.1 200 OK ') if url=="/index/": response=b'index' elif url=='/home/': response=b'home' else: response=b'sorry there is nothing you want' conn.send(response) conn.close() sk.close()
三.根据不同路径返回不同内容函数版
import socket sk=socket.socket() sk.bind(('127.0.0.1',8888)) sk.listen() def oumei(url): return b'welcome to oumei mokuai' def rihan(url): return b'welcome to rihan mokuai' while True: conn,addr=sk.accept() data=conn.recv(8800) print(data) url=data.decode('utf8').split()[1] conn.send(b'HTTP/1.1 200 OK ') if url =='/oumei/': response=oumei(url) elif url =='/rihan/': response=rihan(url) else: response=b'there is nothing' conn.send(response) conn.close()
四.不同路径返回不同内容函数进阶版
import socket sk=socket.socket() sk.bind(('127.0.0.1',8892)) sk.listen() def oumei(url): return b'welcome to oumei bankuai' def rihan(url): return b'welcome to rihan bankuai' def dongnanya(url): return b'welcome to dongnanya bankuai' # 定义一个url和对应的函数的列表 list1=[ ('/oumei/',oumei), ('/rihan/',rihan), ('/dongnanya/',dongnanya) ] while True: conn,addr=sk.accept() data=conn.recv(8877) url=data.decode('utf8').split()[1] conn.send(b'HTTP/1.1 200 OK ') # 定义一个函数变量等于none func=None # 循环列表的每一项 for i in list1: # 如果列表中每一项的第一个内容等于获取的数据url,则找到该url相对应的函数名 if i[0]==url: func=i[1] break # 如果函数名存在则返回函数执行结果赋值给response if func: response=func(url) # 如果不存在则返回下面的内容 else: response=b'there is nothing' #给客户端响应response conn.send(response) conn.close()
五.HTML 版
import socket sk=socket.socket() sk.bind(('127.0.0.1',8898)) sk.listen() def index(url): with open('index.html',"rb" )as f: return f.read() def oumei(url): return b'welcome to oumei bankuai' def rihan(url): return b'welcome to rihan bankuai' def dongnanya(url): return b'welcome to dongnanya bankuai' list1=[ ('/oumei/',oumei), ('/rihan/',rihan), ('dongnanya/',dongnanya), ('/index/',index) ] while True: conn,addr=sk.accept() data=conn.recv(8899) url=data.decode('utf8').split()[1] conn.send(b'HTTP/1.1 200 OK ') func=None for i in list1: if i[0]==url: func=i[1] if func: response=func(url) else: response=b'404 not found' conn.send(response) conn.close()
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h1>这是index页面</h1>
</body>
</html>
六.动态版
import socket import time sk=socket.socket() sk.bind(('127.0.0.1',9901)) sk.listen() def timer(url): with open('time.html','r',encoding='utf-8')as f: # 读取time.html中的内容 ret=f.read() # 将原文件中的@@time@@替换成当前时间的时间字符串格式并重新赋值给ret ret=ret.replace("@@time@@",time.strftime("%Y-%m-%d %H:%M:%S")) # 将新的内容进行编码并作为函数的返回值 return ret.encode('utf-8') def index(url): with open('index.html','rb') as f: return f.read() def oumei(url): return b'welcome to oumei bankuai' def rihan(url): return b'welcome to rihan bankuai' def dongnanya(url): return b'welcome to dongnanya bankuai' # 定义一个URL和函数的对应函数 list1 = [ ('/oumei/',oumei), ('/rihan/',rihan), ('/dongnanya/',dongnanya), ('/index/',index), ('/time/',timer), ] while True: # 等待连接 conn, addr = sk.accept() # 接收消息 data = conn.recv(8000) url = data.decode('utf-8').split()[1] # 发送消息 conn.send(b'HTTP/1.1 200 OK ') 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' # 返回信息 conn.send(response) # 关闭连接 conn.close()
time.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>当前时间是:@@time@@</h1>
</body>
</html>
七.wsgi版
from wsgiref.simple_server import make_server # 将返回不同的内容部分封装成函数 def index(url): with open("index.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), ("/time/",timer), ] # 好戏要来了 def run_server(environ,start_response): start_response("200 OK",[("Content-Type","text/html;charset=utf8")]) url=environ['PATH_INFO'] func=None for i in list1: if i[0]==url: func=i[1] if func: response=func(url) else: response=b'404 not found!' return [response,] if __name__=='__main__': httpd=make_server("127.0.0.1",9902,run_server) print("我在9902等你o.....") httpd.serve_forever() """ 相关词汇: wsgiref.simple_server make_server def run_server函数 参数(environ,start_response); start_response("状态码 状态描述",[("Content-Type","text/html;charset=utf8"),()] environ['PATH_INFO'] ... return [response,] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) print()检测 httpd.serve_forever() """
八.模板渲染
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': 'egon', 'hobby_list': ['街舞', '喝酒', '打豆豆']}) # 把数据填充到模板中 return bytes(ret, encoding="utf8") list1 = [ ("/index/", index), ] 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', 9903, run_server) print("我在9903等你哦...") httpd.serve_forever()
index2.html
<!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>
小结:
1. HTTP协议
1. 请求(浏览器发送给服务器的消息-request)
格式:
请求方式 URL 协议版本
k1: v1
k2: v2
请求数据(请求体)
2. 响应(服务器返回给浏览器的消息-response)
格式:
协议版本 状态码 状态描述符
k1: v1
k2: v2
响应体(HTML)
2. web框架
本质: socket服务端
功能:
a. socket收发消息
b. URL和函数的对应关系,根据不同的URL执行不同的函数,返回函数的结果
c. 读取HTML文件,进行了一个字符替换(模板渲染)
分类:
Django flask tornado
完成了a,b,c三个功能的 ——》 tornado
完成了b,c 两个功能 ——》 Django
完成了b 一个功能 ——》 flask
另一种分类:
1. Django 大而全
2. 其他 短小精悍
九.
(一).安装django
1. pycharm
file settings project 点加号 输入django 选择版本 下载
2.命令行
pip install django===1.11.15
pip install -i 源 django==1.11.15
(二).创建Django项目
1. pycharm
file ——》 new project ——》 django ——》 项目名 ——》选择解释器 ——》create
2. 命令行
django-admin startproject 项目名
(三).启动项目
1. 命令行
切换到有manage.py的目录下
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
2. pycharm
配置好 点绿色三角
(四)创建APP 注册APP
1.pycharm
tools ——> run manage.py task ——> startapp app01
2.命令
python manage.py startapp app01
3.注册app
在settings.py 中的INSTALLED_APPS 写:
'app名' 或者以下
'APP名.apps.App名Config'
(五)配置文件
1.静态文件
STATIC_URL = '/static/' # 别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
2. TEMPLATES 模板 HTML文件
DIRS [os.path.join(BASE_DIR, 'templates')]
3.注释csrf中间件(暂时)
4.数据库的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 引擎
'NAME': 'day66', # 数据库名
'USER':'root', # 用户名
'PASSWORD':'', # 密码
'HOST':'127.0.0.1', # IP
'PORT': 3306, # 端口号
}
}
(六)URL和函数的对应关系 ——> urls.py
from app名 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^test/', views.test)
]
(七).使用MySQL数据
1.创建一个数据库
2.settings的配置
3.告诉Django使用pymysql模块连接数据库
在 settings.py 同级目录下的__init__.py 中写:
import pymysql
pymysql.install_as_MySQLdb()
4.建表
在app 下的models.py 中写类(继承models.Model)
5.执行数据库迁移命令
python manage.py makemigrations 记录modls.py中类是不是发生变化,将变化记录下来
python manage.py migrate 将model的变更同步到数据库中
(八)ORM
对象和关系型数据库的映射 通过操作对象的方式来操作数据库
映射关系:
类 ------数据表
对象-----数据行
属性-----字段
ORM 能做的事:
操作数据表
操作数据行
ORM 操作:
from 项目名 import models
获取所有数据
models.类名.objects.all()
获取一条数据 (获取不到或获取到多条数据时会报错)
models.类名.objects.get(user='alex',pwd='123)
创建一条数据
models.类名.objects.create(user='alex',pwd='123)
(j九) form表单
1.method='post' 请求方式 提交数据的地址
2.所有的input的标签要有name属性
3.有一个input的type='submit' 或者有一个button按钮
(十)GET 和POST
GET 获取一个页面路径后?key1=v1&key2=v2
POST 提交数据
(十一)views.py写函数
request 跟请求相关的所有内容
request.method 字符串 (GET/ POST)
request.POST POST请求提交的数据 字典
request.GET GET 请求提交的数据
返回值 from django.shortcuts import HttpResponse,render,redirect
HttpResponse(''字符串'') 页面显示的就是'字符串
render(request,'模板文件名',{ 渲染动态数据}) 渲染你的HTML文件返回给浏览器
redirect('/要跳转的URL/') 重定向 告诉浏览器再向URL再发一次GET请求