zoukankan      html  css  js  c++  java
  • django(django框架了解,http协议)

    Django框架

    学习目的:

    完成web应用的编写

    django的作用:

    0.业务逻辑分发(路由分发)

    1.业务逻辑实现:

    业务逻辑根据分发来完成具体的事,再根据具体事的需求,和页面或数据库交互,返回处理后的结果

    2.页面模板的渲染

    3.数据库的交互

    b/s架构

    brower浏览器:不用自己写

    server服务端:需要使用支持wsgi的server,也不用自己写

    Python的web框架

    a.socket b.页面路由 c.模块渲染

    1.Django a 用的wsgiref b 自己写 c自己写,

    优点:功能全面

    2.Flask a用的第三方,b自己写的,c自己写的,

    优点:小而轻

    3.Tornado a 自己写 b 自己写 c自己写

    优点:支持高并发

    http协议

    hyperText Transport Protocol超文本传输协议
    1.基于TCP/IP协议基础上的应用层协议,底层实现仍为socket
    2.基于请求-响应模式:通信一定是从客户端开始,服务端接收到客户端一定会做出对应响应
    3.无状态:协议不对任何一次通信状态和任何数据做保存
    4.无连接:一次连接只完成一次请求-响应,请求-响应完毕后会立即断开连接  
    

    http工作原理(事务)

    一次http操作称之为一个事务,工作过程可分为四步:
    1.客户端与服务端建立连接
    2.客户端发生一个http协议指定格式的请求 
    3.服务器端接收到请求后,响应一个http协议指定格式的响应
    4.客户端将服务器的响应显示展现给用户
    

    http指定格式的请求和响应

    请求:
    1.请求行
    请求行以一个方法符号开头,以空格分开,后面跟着请求的URL和协议的版本。
    POST (请求方式)/login(请求路径)/ HTTP/1.1(请求协议)
    
    2.请求头
    请求头包括本机信息、浏览器信息等等,当然,也包括URL中?后面的参数
    3.请求体
    需要发送的数据
    GET:请求体放在请求路径后拼接
    POST:以数据包方式单独发送
        
    request.method
    响应
    1.响应行
    2.响应头
    3.响应体
    响应行是必须的,其他可选
    HTTP/1.1 200 OK
    
    
    
    LOGIN success
    响应行,响应头,响应体之间以
    分隔
    响应头各行之间也需要以
    区分结束
    
    使用TCP/IP协议的套接字给网页响应时
    需要遵循http协议
    正确的响应
    响应头决定响应体返回什么样的方式数据
    browser.send(b"HTTP/1.1 200 OK
    ")#响应行必须有
    browser.send(b'Content-type:text/html
    ')#响应头,服务于响应体(了解)
    browser.send(b"
    ")#响应行,响应头,响应体之间需要
    
    browser.send(b'hello world')
    browser.close()#无连接,1次请求-响应后断开连接]
    

    wsgi的server

    from wsgiref import simple_server
    
    #请求的数据被解析在env字典中
    #res规定http的响应结果
    #返回的是装有二进制数据的列表
    #请求路径:env["PATH_INFO"]
    #请求方法:env["REQUEST_METHOD"]
    #res("200 OK",[("Content-type,'text/html'")])
    def app(env,res):
    	res("200 OK",[("Content-type","text/html")])    
        return []
      
    server = simple_server.make_server('127.0.0.1',8803,app)
    #服务常启
    server.serve_forever()
    
    

    数据的获取

    1.get请求
    数据在env的query_string字段中
    res = env(QUERY_STRING)#是二进制数据...
    2.post请求
    数据长度content_length
    数据存放的io流 wsgi.input
    lenth = int(env["CONTENT_LENGTH"])
    res = env["wsgi.input"].read(lenth)
    

    使用jinja2渲染动态网页

    1.from jinja2 import Template
    2.读取文件
    with open("login.html","rt")as f:
        msg = f.read()
    3.渲染数据得到模板tem
    tem = Template(msg)
    4.模块替换数据
    msg = tem.render(result=res)
    return msg.encode("utf-8")
    result 在 html 中的表示{{result}}
    使用模块的好处:(可以传字典)
        tem.render(result = res,my_dic = dic)
        
     html
    {{my_dic}}
    {% for k in  my_dic %}
    <div>{{k}}:{{my_dic[k]}}
    </div>
    {% endfor %}
    
    
  • 相关阅读:
    系统设计的定量原理
    [Java-基础]单元测试Junit
    二维图元生成:直线生成算法
    [Java-基础]反射_Class对象_动态操作
    浅说模板的局限性
    普通函数和函数模板调用规则
    普通函数和函数模板的区别
    十大排序算法(原理及代码实现细节)
    linux远程登陆以及从其他服务器下载文件
    循环队列-抽象数据类型
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10478826.html
Copyright © 2011-2022 走看看