zoukankan      html  css  js  c++  java
  • django之前-----web应用与框架

    一web应用

    web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。应用程序有两种模式C/S、B/S。

    下面来看一个简单的socket服务器

    # -*- coding:utf-8 -*-
    
    import socket
    sk=socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    
    while 1:
        conn,client_addr=sk.accept()
        conn.recv(1024)
        conn.send(b'hello')  
        conn.close()
    sk.close()

    然后我们通过浏览器访问,浏览器出现错误信息:该网页无法正常运作

    什么原因呢?我们先来看看收到请求的输出信息

    data b'GET / HTTP/1.1
    Host: 127.0.0.1:8800
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: csrftoken=IwhDDZ9RiKQUV4T5CbzGIhAcVZNxYuvAYdS7RKc0tmOmk02hHWfQ8sWnIGrN1pzC
    
    '
    View Code

    这个完整的信息里面可以看到:最开始它有个http的头部信息,这个是个标准,那么我们试着去加入

    改为

    # -*- coding:utf-8 -*-
    
    import socket
    sk=socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    
    while 1:
        conn,client_addr=sk.accept()
        conn.recv(1024)
        conn.send(b'HTTP/1.1 200 OK
    
    ')  #需要一个http的头
        conn.send(b'<h1>o98k</h1>') #发送的主体,也可以放入上面的那行
        conn.close()
    sk.close()

    现在访问正常了,也能输出我们要的信息

    如果我们要根据用户输入的路径访问不同的页面呢

    1 我们可以做判断,然后指向不同的函数

    # -*- coding:utf-8 -*-
    
    import socket
    sk=socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    
    def home(url):
        return b"this is home page"
    
    def index(url):
        return b'this is index home'
    
    while 1:
        conn,client_addr=sk.accept()
        data=conn.recv(1024)
        data_str=str(data,encoding='utf8')
        url=data_str.split('
    ')[0].split()[1]
        print(url)
        print('='*30)
        if url=='/index/':
            msg=index(url)
        elif url =="/home/":
            msg=home(url)
        else:
            msg=b"404!"
        conn.send(b'HTTP/1.1 200 OK
    
    ')  #需要一个http的头
        conn.send(msg) #发送的主体,也可以放入上面的那行
        conn.close()
    sk.close()
    View Code

     2 我们可以将这些不同的页面单独拿出来(比如文件),然后指向他们

    # -*- coding:utf-8 -*-
    import socket
    sk=socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    
    def home(url):
        with open("home.html",'rb')as f:
            html_msg=f.read()
            return html_msg
    
    def index(url):
        return b'this is index home'
    
    while 1:
        conn,client_addr=sk.accept()
        data=conn.recv(1024)
        data_str=str(data,encoding='utf8')
        url=data_str.split('
    ')[0].split()[1]
        print(url)
        print('='*120)
        if url=='/index/':
            msg=index(url)
        elif url =="/home/":
            msg=home(url)
        else:
            msg=b"404!"
        conn.send(b'HTTP/1.1 200 OK
    
    ')  #需要一个http的头
        conn.send(msg) #发送的主体,也可以放入上面的那行
        conn.close()
    sk.close()
    View Code

    3 我们将他们优化一下,比如将要访问的页面放入一个列表,并且带有一点动态网页的效果

    # -*- coding:utf-8 -*-
    import socket
    import time
    sk=socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    
    def home(url):
        with open("home.html",'r')as f:
            html_msg=f.read()
    
        now=time.time()
        msg=html_msg.replace("uf;afsaf ",str(now))
        return bytes(msg,encoding='utf8')
    
    def index(url):
        return b'this is index home'
    
    def user(url):
        return b'this is user page'
    
    
    url_func=[
        ('/index/',index),
        ('/home/',home),
        ('/user/',user),
    
    ]
    
    while 1:
        conn,client_addr=sk.accept()
        data=conn.recv(1024)
        data_str=str(data,encoding='utf8')
        url=data_str.split('
    ')[0].split()[1]
        func=None
        for i in url_func:
            if i[0]== url:
                func=i[1]
                break
        if func:
            msg=func(url)
        else:
            msg=b"404!"
        conn.send(b'HTTP/1.1 200 OK
    
    ')  #需要一个http的头
        conn.send(msg) #发送的主体,也可以放入上面的那行
        conn.close()
    sk.close()
    View Code

     这里简单说说http协议:

    端口号80 ;HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。

    http协议的特点:

    http协议是基于TCP/IP协议之上的应用层协议。

    HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应

    HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。

    服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。这个是http协议无连接的特性

    http协议的请求和响应

            浏览器往服务端发的消息叫:请求(request)
                请求行  GET /index/ HTTP/1.1
                请求头  k1:v1
                
    
                请求体
            
            服务端回复给浏览器的消息叫:响应(response)
                响应行  HTTP/1.1 200 OK
     
                响应头  Content-Type: text/html; charset=utf-8
    
                        k2:v2
    
                        ...
                
    
                响应体  我们在浏览器上看到的内容

    http的两种请求方式 get post

    GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
    GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
    GET与POST请求在服务端获取请求数据方式不同。

    查看Pycharm控制台,使用谷歌浏览器访问一次网页。实际上,是有2次请求的。

    第一次,是正常请求。第二次是,favicon.ico请求,它是网页图标问题。这个请求,忽略即可。

    GET的数据,是放到url后面的。POST数据是放在请求体后面的。

    301重定向

    永久性重定向。该状态码表示请求的资源已被分配了新的UR1,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的UR1重新保存。
    像下方给出的请求URI,当指定资源路径的最后忘记添加斜杠"/",就会产生301状态码。
    http://example.com/sample

    302重定向

    临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
    
    和301MovedPermanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。比如,用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,
    而是仍旧保留返回302状态码的页面对应的URI。

     web框架

    一个web框架一般实现下面三个动能

        总结:
            a. 接收浏览器发送的消息
            b. 根据不同的路径返回不同的内容
            c. 通过字符串替换 实现 动态网页
            
            
            Python Web框架分类:
                1. 框架自带 a,b,c                  Tornado
                2. 框架自带b,c 使用第三方a        Django
                3. 框架自带b,使用第三方的a和c      Flask
                
            另外一个维度的分类:
                1. Django    --> 大而全 
                2. 其他   
  • 相关阅读:
    [原创]软件性能测试培训
    100w条记录分页,可以有多快?—— DataReader分页与SQL语句分页的对比测试(在线演示)
    【自然框架】注册会员活动——第一份代码的修改建议(第一版)
    加班有几种情况?兼谈讨论的方式。
    衔着树枝飞跃太平洋的傻鸟!(童话版)
    参加活动的好处。
    【自然框架】开源社区活动,会员注册的第一份代码!
    【自然框架】数据访问之精雕细琢(一)存储过程的参数
    自然框架开发系列(一):自然框架 和 AgileEAS.NET 合作,开发b/s的药店系统!
    自然框架开源社区的第一次活动——实现会员注册
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9695330.html
Copyright © 2011-2022 走看看