首页 > 技术文章 > web的基本流程

yuan-x 2020-04-03 22:28 原文

WEB的本质:

  通过http协议,前后端进行数据交互。本质就是socket服务端与浏览器的通信。基本形式是前端向目标地址发起请求,后端收到后从请求首行中获取路径,然后匹配对应的函数(接口)进行执行,然后函数会进行一系列的处理,然后返回,可能是具体的数据,也可能是其他的比如html网页。

 

简单的代码:

1 目录结构:

 

 2 后端代码:

import socket
import time
from jinja2 import Template
'''
web框架总结:
    1 web框架的本质:
          socket服务端与浏览器的通信
    2 socket服务端功能划分
          a 负责与浏览器收发消息(socket)
          b 根据用户访问不同的路径执行不同函数
          c 从html读取出内容 并且完成字符串替换
    3 python中web框架的分类
          1 框架自带abc的   tornado
          2 框架自带bc的 使用第三方模块的a django
          3 自带b  使用第三方的a和c    flask
        另外一种:
          Django和其他
          django  大而全  
          flask  轻量级

'''
def f_404(url):
    ret = '<p>not found-->{}</p>'.format(url)
    return bytes(ret, encoding='utf-8')
def nihao(url):
    ret='<p>hello-->{}</p>'.format(url)
    return bytes(ret,encoding='utf-8')

def nimei(url):
    print(url)
    with open('nimei.html','r',encoding='utf-8')as f:
        ret=f.read()
        ret2=ret.replace('oo@zz',str(time.time()))
    return bytes(ret2,encoding='utf-8')

def html01(url):
    print(url)
    with open('html01.html','rb')as f:
        html_msg=f.read()
    return html_msg

def jinja2_01(url):
    print(url)
    with open('jinja2_temp.html','r',encoding='utf-8')as f:
        data=f.read()
    temp_data=Template(data)
    ret=temp_data.render({'name':'hello yuan','hobby_list':['喝茶','抽烟'],'url':url})
    return bytes(ret,encoding='utf-8')

base_url=[('/nihao',nihao),('/nimei',nimei),('/html01',html01),('/jinja2',jinja2_01)]

sk = socket.socket()
sk.bind(('127.0.0.1', 10055))
sk.listen()

while 1:
    conn, addr = sk.accept()
    data = conn.recv(1024)
    # 前后端 使用http格式交互数据,在浏览器直接访问
    print(data)
    data_str=str(data,encoding="utf-8")

    lista=data_str.split('\r\n')
    print('lista',lista[0])
    url=lista[0].split(' ')[1]
    # with open('data','wb')as f:
    #     f.write(data)

    for i in base_url:
        print(i)
        if i[0]==url:
            func=i[1]
            break
        else:
            func=f_404
    conn.send(b'HTTP/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n')
    respondata=func(url)
    conn.send(respondata)
    # if url=='/nihao':
    #     responsedata=nihao(url)
    #     conn.send(responsedata)
    # elif url=='/nimei':
    #     responsedata = nimei(url)
    #     conn.send(responsedata)
    # else:
    #     conn.send(b'<p>url 404</p>')
conn.close()

sk.close()

 

3 jinja2_temp.html 使用了jinja2模板语法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jinja2模板</title>
</head>
<body>
{{name}}
<ul>
    {% for i in hobby_list %}
    <li>{{i}}</li>
    {% endfor %}
</ul>

<p>{{url}}</p>
</body>
</html>

  jinja2支持循环的,基本流程--->后端收到请求后,先读取html文件,然后获取数据(比如从数据库请求),然后生成Template实例,使用render函数传参,当然html中要使用jinja2语法,在需要数据填充的地方使用参数的k代表,就会取到响应的值,这一切都是在后端进行的。

 

推荐阅读