DNS是什么
dns全称Domain Name System,又称域名系统,是互联网的一项服务,
主要在dns服务器中保存着域名和ip地址的对应关系,为人们提供域名解析服务。
全球一共有13台根dns服务器,美国10台,欧洲2台,分布在英国和瑞典,
亚洲1台,在日本。
DNS架构
服务器的包含关系是:具体如下图
根DNS服务器 > 顶级DNS服务器 > 权威DNS服务器 > 二级域名的DNS服务器
根DNS服务器 :掌握着所有顶级dns的ip和域名的对应关系
顶级DNS服务器 :掌握着权威dns的ip和域名的对应关系
eg: .com .cn .org
权威DNS服务器 :掌握着二级域名dns服务器的ip和域名的对应关系
eg: baidu.com sina.com
二级域名的DNS服务器 :掌握着你要访问的域名和ip的对应关系
eg: www.baidu.com new.sina.com
在浏览器输入url按下回车的整个过程
大方向分为三个过程
1.把输入的url域名通过dns解析成ip地址
2.浏览器向ip发送请求信息(包括请求头Request Headers和请求体Request Body)
3.服务器向浏览器回应一个响应信息(包括响应头Response Headers和响应体Response Body)
但是dns解析的过程又可分为下面六个过程,具体看下图
1.先向本地dns缓存查看有没有该域名对应的ip地址,有直接跳出,没有接着往下
2.向根dns服务器询问域名对应的ip地址(根dns服务器会让他去查询顶级dns服务器)
3.向顶级dns服务器询问域名对应的ip地址(顶级dns服务器会让他去查询权威dns服务器)
4.向权威dns服务器询问域名对应的ip地址(权威dns服务器会让他去查询二级dns服务器)
5.向二级dns服务器询问域名对应的ip地址(二级dns服务器会返回对应的ip地址)
6.接收到ip地址后,会先把ip和域名对应关系保存到本地dns缓存,以便下次方便访问
web框架原理
web框架主要分为三个部分
1、启动socket服务端
2、路由系统,写出uri与函数的对应关系
3、模板引擎渲染,将html页面与mysql中的数据进行融合
启动socket服务端
import socket server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5) # ①写socket服务端 while True: conn, addr = server.accept() data = conn.recv(8192) data = str(data,encoding='utf-8') header = data.split('\r\n\r\n')[0].split('\r\n')[0] # 拿到需要的头部信息 GET / HTTP/1.1 router = header.split(' ')[1] # 获取浏览器访问的uri信息 / # 我们要写一个uri与对应函数的映射关系 # 拿出uri对应的函数名,调用 func_name = None for rout in router_list: if rout[0] == router: func_name = rout[1] break # 判断访问的uri是否存在映射关系 if func_name: # 有就存在 res = bytes('访问成功',encoding='utf-8') else: res = bytes('访问不存在',encoding='utf-8') # 拿到要返回给浏览器的结果后开始返回数据 # 我们需要先返回一个响应头 conn.send(bytes('HTTP/1.1 200 OK \r\n\r\n')) # 最简单的响应头 # 再发送主体信息 conn.send(res) # 关闭一次连接 conn.close()
路由系统 - uri与函数的对应关系
# ②写函数与uri的映射关系 def home(): pass def index(): pass router_list = [ ('/',home), ('/index',index) ] # ①写socket服务端 while True: conn, addr = server.accept() data = conn.recv(8192) data = str(data,encoding='utf-8') header = data.split('\r\n\r\n')[0].split('\r\n')[0] # 拿到需要的头部信息 GET / HTTP/1.1 router = header.split(' ')[1] # 获取浏览器访问的uri信息 / # 我们要写一个uri与对应函数的映射关系 # 拿出uri对应的函数名,调用 func_name = None for rout in router_list: if rout[0] == router: func_name = rout[1] break # 判断访问的uri是否存在映射关系 if func_name: # 有就存在 res = bytes('访问成功',encoding='utf-8') else: res = bytes('访问不存在',encoding='utf-8') # 拿到要返回给浏览器的结果后开始返回数据 # 我们需要先返回一个响应头 conn.send(bytes('HTTP/1.1 200 OK \r\n\r\n')) # 最简单的响应头 # 再发送主体信息 conn.send(res) # 关闭一次连接 conn.close()
模板引擎渲染
自定义规则
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>渲染模板</title> </head> <body> <table> <!--占位字符--> @@content@@ </table> </body> </html> 渲染的页面
def home(): # 返回静态页面 # 先读出静态html文件 f = open('静态页面.html','r') data = f.read() f.close() return bytes(data,encoding='utf-8') def index(): # 也要先读出html页面 f = open('静态页面.html', 'r') data = f.read() f.close() # 模板引擎渲染,将html代码与mysql数据库进行融合(自己定制规制,或者使用第三方工具) # 第一种,自定义规则,先在需要放数据的地方用自定义的占位符占位 # 链接数据库,取出想要的数据 import pymysql conn = pymysql.connect(host='127.0.0.1',user='root',password='123', database='db1',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = "select * from table1" res = cursor.fetchall() # 取出来的是一个列表里面套字典的形式,我们需要拿出我们需要的值进行字符串拼接 r_list = [] for r in res: s = '<tr><td>%s</td><td>%s</td></tr>'%(r['name'],r['pwd']) r_list.append(s) # 全部添加完之后再做一个整体的拼接 need = ''.join(r_list) # 拼接好之后进行替换出我们之前html中的占位字符 res = data.replace('@@content@@',need) # 替换好之后可以把信息返回给浏览器了 return bytes(res,encoding='utf-8') server服务端
def home():
# 返回静态页面
# 先读出静态html文件
f = open('静态页面.html','r')
data = f.read()
f.close()
return bytes(data,encoding='utf-8')
def index():
# 也要先读出html页面
f = open('静态页面.html', 'r')
data = f.read()
f.close()
# 模板引擎渲染,将html代码与mysql数据库进行融合(自己定制规制,或者使用第三方工具)
# 链接数据库,取出想要的数据
import pymysql
conn = pymysql.connect(host='127.0.0.1',user='root',password='123',
database='db1',charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from table1"
res = cursor.fetchall()
# 第二种模板引擎渲染是通过第三方的工具,这里用的是jinja2
from jinja2 import Template
template = Template(data)
res = template.render(user= res) # 这里需要把key和html里的占位符对应好
return bytes(res,encoding='utf-8')
server服务端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>渲染模板</title> </head> <body> <table> <!-- 这里的占位符是{{name}} 外面传值必须通过key,value传值, key需要与占位字符一致 --> {{name}} <!-- 如果外面传进来列表,在这里也可以循环--> {% for k in name %} <!-- 如果循环出来的k是字典,可以用点key进行取值--> <td>{{k.name}}</td> {% endfor %} </table> </body> </html> 渲染的页面
django的安装和使用
安装
1.pip3安装:pip3 install django==1.11.10 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.pycharm安装
创建
1、命令行启动
python3 manage.py runserver 127.0.0.1:8090
2.pycharm创建
目录介绍
mysite:
settings.py : 用户自定义的各种配置
urls.py : 路由文件
wsgi.py : 启动socket服务端的 文件
mange.py: 管理文件 python mange.py 各种命令
创建django项目
1、首先要配置模板文件路径
'DIRS': [os.path.join(BASE_DIR, 'templates')]
pycharm创建的会帮我们自动配置好,命令行创建需要自己添加
2、然后配置静态资源的文件路径 js css img
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'), (逗号不能少)
)
3、然后注释中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
注:前面三个的配置都是在配置文件settings中完成
4、最后开始写业务逻辑
1.先写uri与函数的对应关系
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', index),
]
2.写业务逻辑函数
def fun(resquest):
pass