zoukankan      html  css  js  c++  java
  • django6

    复习

    1 web应用
    	-通过浏览器访问的服务
        -cs/bs
        -基于socket
    2 Http协议
    	-http协议版本,0.9   1.1   2.x  3.x  有什么异同
        -请求头和响应头中的key-value
        -请求协议
        	-请求首行:请求方式,地址,协议和版本
            -请求头
            -请求体
        -响应协议
        	-响应首行:协议版本,状态码,状态
            -响应头
            -响应体:html,css,js
        -特点
        	-基于socket
            -基于请求响应
            -无状态无连接
        -url:统一资源定位符
            
    3 web框架
    	-wsgiref(socket的封装)自己写了一个web框架
        -(django 3.1版本后是异步框架,flask):同步框架  (tornado,sanic,fastapi):异步框架
    	-其他socket服务端(遵循WSGI协议)
        	-wsgiref,uwsgi(c语言写的),tornado,gunicorn(python写的)
            -uwsgi+django
            -gunicorn+flask
    4 django
    	-安装(虚拟环境),创建项目,创建app
        -配路由,写视图函数,modeles
        -静态文件配置
       	-路由配置
        	-url函数,re_path函数,path函数,四个参数
            -有名,无名分组
            -路径后是否加/
            -路由分发 include
            -反向解析(通过别名拿到路径)
            -名称空间
            -2.x的转换器(5  str int )
            -自定义转化器
    5 视图层
    	-request对象
        	-请求方方法
            -get请求参数,地址栏中的参数
            -post请求参数,请求体中的参数(name=lqz&password=123),有的格式取不出来
            -http://127.0.0.1:8000/login/?name=lqz  向这个地址发送post请求
        -response对象
        	-三件套
    8 模型层models.py
    	-可以创建表,可以删除表,可以新增字段,删除字段(不能创建数据库)
    	-默认使用sqlite(如果使用mysql)
    	-写类,写字段
        -数据库迁移,两条命令
    9 模板层
    	-{{变量}}
       
    10 请求生命周期,mtv和mvc
     web微信如何做的?(服务端主动向客户端推送消息)
    	-轮询
        -长轮询
        -websocket:主动推送消息,应用层协议
        
        
    面试题:http1.0和http1.1的区别
    1.长连接
    	HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点
    2.缓存处理
    	在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
    3.带宽优化和网络连接的使用
    	HTTP1.0中,存在一些浪费带宽的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接
    4.错误通知的管理
    	在HTTP1.1中新增24个状态响应码,如409(Conflict)表示请求的资源与资源当前状态冲突;410(Gone)表示服务器上的某个资源被永久性的删除
    5.Host头处理
    	在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
    

    今日内容

    1 视图层之请求对象

    def index(request):
        '''
        request:django封装的对象,它的类是WSGIRequest,它里面包含了所有http请求的东西
        '''
        print(request)
        print(type(request))
        # from django.core.handlers.wsgi import WSGIRequest
        #######################1 讲过的
        print(request.method)
        print(request.GET)
        print(request.POST)
    
        ########################2 新讲的path,get_full_path,META,FIELS,body
        # 自定制请求头
        # 上传文件使用的编码方式是form-data,默认编码方式urlencoded
        print(request.is_ajax()) # 是不是ajax请求
        print(request.path)      # 请求路径
        print(request.get_full_path()) # 请求全路径,带数据
        print(request.body)      # 请求体,二进制,如果传文件,这个报错
        '''
        使用form表单,默认情况下数据被转成name=lqz&password=123放到请求体中
        request.POST其实是从body中取出bytes格式的,转成了字典
        requet.GET其实是把路径中?后面的部分拆出来,转成了字典
        '''
        print(request.encoding) # 客户端向服务端传递时,使用的编码方法
    
        print(request.META)    # 重点,是字典形式,一堆东西包含请求用户的ip地址,请求头中数据,用户自定制请求头的数据等
        '''
        把请求头的key值部分统一加HTTP_  并且全部转成大写
        '''
        print(request.META['REMOTE_ADDR'])  # 客户端的ip地址
        print(request.FILES)  # 客户端上传的文件,得到是文件对象
    
        ########################3 暂时不用关注(后面会讲)
        print(request.COOKIES) # 空字典
        print(request.session) # session对象
        print(request.user)    # 匿名用户
        return HttpResponse('ok')
    

    2 视图层之响应对象

    ### 重点:JsonResponse的使用(看源码)
    需要导入 from django.http import JsonResponse
    def index(request):
        # 三件套
        # return HttpResponse('ok')
        # return render(request,'index.html',context={'name':'lqz','age':18})  后面字典的值是模板层中的参数
        # return redirect('/home') # 重定向自己的地址,重定向第三方地址,经常跟反向解析一起使用
    
        # 向客户端返回json格式数据
        # import json
        # res=json.dumps({'name':'刘清政','age':18},ensure_ascii=False)
        # return HttpResponse(res)
        # django内置提供的JsonResponse
        # 本质还是HttpResponse
    
        # ensure_ascii
        # return JsonResponse({'name':'刘清政','age':18},json_dumps_params={'ensure_ascii':False})  #保证中文正常显示
        # safe,转换除字典以外的格式,需要safe=False
        return JsonResponse([11,12,13,'lqz',[1,2,3],{'name':'lqz','age':19}],safe=False)
    

    3 cbv和fbv

    # CBV基于类的视图(Class base view)和FBV基于函数的视图(Function base view)
    # 之前学的全是FBV,写的是视图函数
    
    # 写视图类(还是写在views.py中)
    ## 第一步,写一个类,继承View
    from django.views import View
    
    class Index(View):    # 一定要继承View
        def get(self, request):  # 当url匹配成功,get请求,会执行它
            return HttpResponse('ok')
    
        def post(self,request):
            return HttpResponse('post')
        
    ## 第二步:配置路由
    path('index/', views.Index.as_view()),  执行了类调用方法as_view是父类中的方法
    
    # 前期,全是FBV,后期,drf全是CBV
    
    image-20201010181347889

    可以继承很多种类的view,但是一般只用View,如上图,继承TemplateView时使用,后面不需要返回,内部已经封装好了,只需要template_name='html文件名'

    4 文件上传

    ## html注意编码方式
    <form action="/index/" method="post" enctype="multipart/form-data">
    
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="password" name="password"></p>
        <p><input type="file" name="myfile"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    
    # views.py
    def index(request):  # 经常写成def index(request,*args,**kwargs)防止使用有名或者无名分组时出错
        file=request.FILES.get('myfile')  # 此字典的键取值是name的值,如果有多个可以用getList全部取出,get取值会默认在相同的键中取最后一个。得到的file是文件对象
        # 打开一个空文件,写入
        with open(file.name,'wb') as f:
            for line in file.chunks():   # 此处源码中用到了生成器
                f.write(line)
        return HttpResponse('文件上传成功')
    

    6 postman软件

    模拟发送http请求(控制请求路径,请求方式,请求头,请求体)

    7 form表单,提交地址

    # action
    #1 不写,默认向当前地址发送请求
    #2 /index/,向当前域(http://127.0.0.1:8000/)的/index/发送请求
    #3 http://127.0.0.1:8000/index/,向该地址发送请求(可以向第三方服务发送请求)
    
    # method
    # 1 post:发送post请求(默认编码情况下:以key=value&key=value的形式拼到请求体中)
    # 2 get:发送get请求(以key=value&key=value的形式拼到路径中)
    <form action="/index/" method="post">
    
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="text" name="password"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    

    8 Pycharm的自动提示

    from django.core.handlers.wsgi import WSGIRequest
    # pycharm的自动提示,可以用到视图函数中,给予对象.后面的提示
    request=request  # type: WSGIRequest
    
    image-20201010114248189
  • 相关阅读:
    为什么不直接使用socket ,还要定义一个新的websocket 的呢
    js-权威指南-Web套接字
    CSS-蜂窝状展示区域(多个六边形)的一种实现方式
    MQTT入门介绍
    【珍惜时间】vuepro
    搭建react的vw架构时候报 Cannot load preset "advanced".
    跟我一起使用create-react-app脚手架搭建vw-layout解决方案
    【珍惜时间】iReport
    vue中 给router-view 组件的 绑定 key 的原因
    SQL Server Index详解
  • 原文地址:https://www.cnblogs.com/feiguoguobokeyuan/p/13964435.html
Copyright © 2011-2022 走看看