zoukankan      html  css  js  c++  java
  • DAY74-Django框架(五)

    一、虚拟环境

    对于一些需要跑在不同版本的模块下的项目,可以跑在虚拟环境中运行

    创建虚拟环境的两种方法

    • pychanrm**创建

      1.创建项目时选择使用虚拟环境

      2.在已创建的项目中设置setting

    注:纯净环境就是没有任何模块

    • 命令行创建

      1.下载virtualenv软件

    pip3 install virtualenv
    

    ​ 2.创建虚拟环境

    #创建纯净环境
    virtualenv  env_django
    #创建环境,继承了原安装的模块
    virtualenv  --system-site-packages env_django
    

    ​ 3.激活虚拟环境

    #通过命令行,进入虚拟环境的文件夹下的Script文件,输入
    active
    

    ​ 4.退出虚拟环境

    deactivate
    

    二、Django2.0与Django1.0的路由区别

    唯一的区别就是1.0版本路由使用的是URL(),而2.0的是re_path和path

    re_path

    与url的用法一模一样,并且分组出来的数据也是字符串类型

    re_path('正则表达式',视图函数,参数,别名)
    

    path

    这是2.0新增的,传过来的路径是准确路径,而不是正则表达式

    path('准确路径 | 转化器', 视图函数,参数,别名),
    #转化器由<>包裹,包含<转化器类型:变量>,若没有转化器,将匹配任何字符串
    path('test/<path:year>', views.re_test),
    
    #转化器类型
    #str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    #int,匹配正整数,包含0。
    #slug,匹配字母、数字以及横杠、下划线组成的字符串。
    #uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    #path,匹配任何非空字符串,包含了路径分隔符(/)
    

    自定义转换器

    对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

    • regex 类属性,字符串类型

    • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。

    • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

    #编写自定义转化器
    class MyCon:
        # 写一个正则表达式
        regex = '[0-9]{4}'
        # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收
        def to_python(self, value):
            return int(value)
        # 反向解析用的
        def to_url(self, value):
            return '%04d' % value
        
    #注册自定义转化器
    from django.urls import register_converter
    register_converter(MyCon,'yyy')
    
    #使用自定义转化器
    path('test/<yyy:year>', views.re_test,name='test'),
    

    三、视图层

    HttpRequest对象

    django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。

    #常用属性
    # 前台Post传过来的数据,包装到POST字典中
    request.POST
    
    # 前台浏览器窗口里携带的数据,包装到GET字典中
    request.GET
    
    # 前台请求的方式
    request.method
    
    # post提交的数据,body体的内容,前台会封装成:name=lqz&age=18&sex=1。适合处理非表单数据
    request.body
    
    # 取出请求的路径,取不到数据部分
    request.path
    
    # 取出请求的路径,能取到数据部分
    request.get_full_path()
    
    #取出表单请求方法为POST,并编写方式是enctype="multipart/form-data"的所有上传文件信息
    request.FILES
    
    #包含所有的HTTP 首部信息,以字典的形式
    request.META
    #注意:request.META['HTTP_REFERER']  表示上一个跳转页面
    

    HttpResponse对象

    响应对象主要有三种形式:

    • HttpResponse():括号内直接跟一个具体的字符串作为响应体返回
    • render():将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
    • redirect():重定向

    render()

    #render(请求对象,模板名,模板需要的参数(字典形式))
    render(request, template_name[, context])
    
    #要知道render和redircet都是HttpResponse的对象
    #render的内部原理
    from django.template import Template,Context
    #调用Template,传入html标签
    temp=Template('<h1>{{ user }}</h1>')
    #调用Context,传入数据标签
    con=Context({'user':'lqz'})
    #二者合一
    ret=temp.render(con)
    #最后用HttpResponse传出去
    return HttpResponse(ret)
    

    JsonResponse对象

    向前端返回一个json格式字符串

    from django.http import JsonResponse
    def test(request):
        dic={'name':'lqz','age':18}
    	return JsonResponse(dic)
    
        ll = ['name', 'age']
        # 报错,默认不支持列表形式
    	return JsonResponse(ll)
    
    	# 支持列表形式
    	return JsonResponse(ll,safe=False)
    
    #JsonResponse方法内部其实是调用了json模块,在内部进行了转换
    import json
    dic={'name':'lqz','age':18}
    # 把字典转换成json格式,返回到前台
    return HttpResponse(json.dumps(dic))
    

    五、CBV与FBV

    CBV:基于类的视图(Class base view)

    #路由层:
    url(r'^test/', views.Test.as_view()),
    #视图层
    from django.views import View
    class Test(View):
         def get(self, request):#一定要传request对象
             return HttpResponse('get-test')
        
    	 def post(self, request):
             return HttpResponse('post-test')
    

    FBV:基于函数的视图(Function base view)

    七、简单文件上传

    前端:
        #enctype属性
            #application/x-www-form-urlencoded:默认,POST会拿到控件传过来的值,除了文件,只会获得文件的名字;FILES也没获得文件
            #multipart/form-data:POST拿不到文件信息,会将文件信息与数据存放到FILES中;如果没上传文件就提交,POST会得到文件的字典形式,value为空
            #text/plain:不会拿到表单信息
        <form action="" method="post" enctype="multipart/form-data">
            <input type="file" name="myfile">
            <input type="text" name="password">
            <input type="submit" value="提交">
            </form>
    后台:
    	def fileupload(request):
            if request.method=='GET':
            	return render(request,'fileupload.html')
            if request.method=='POST':
            	# 从字典里根据名字,把文件取出来
            	myfile=request.FILES.get('myfile')
            	# 文件名字
            	name=myfile.name
            	# 打开文件,把上传过来的文件存到本地
            	with open(name,'wb') as f:
            		# for line in myfile.chunks():
            		for line in myfile:
            			f.write(line)
            	return HttpResponse('ok')
    
  • 相关阅读:
    JAVA中线程同步的方法(4种)汇总
    java
    指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。(解决问题总结)
    无法将类型为“System.Windows.Controls.SelectedItemCollection”的对象强制转换为类型“System.Collections.Generic.IList`1
    foreach---集合已修改;可能无法执行枚举操作。
    WPF_View中控件使用单例ViewModel
    判断s2是否能够被通过s1做循环移位(rotate)得到的字符串是否包含
    多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')
    异步对象(XMLHttpRequest)的帮助脚本
    在vs2010使用EF出现CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9931204.html
Copyright © 2011-2022 走看看