zoukankan      html  css  js  c++  java
  • Django入门(五)

    一、Django中python的虚拟环境

      需求:假如公司只有一台服务器,开发的项目基于Django1.5的。现在却要基于Django2.0开发一套程序,且Django1.5不能卸载,必须还要安装新版本。

      这时候就需要用到虚拟环境了。

    1、通过PyCharm创建

      File-->New Project-->Django-->出现下图,如图所示进行创建。

    2、通过命令创建

      安装:
               -pip3 install virtualenv
          创建虚拟环境:
               -(1)virtualenv env_django(创建虚拟环境)

               -(2)virtualenv --system-site-packages env_django(创建环境,继承原安装的模块)
          激活该虚拟环境:
               -windows进到目录里,的Script文件夹输入:activate
          退出虚拟环境:
               -deactivate
          在pycharm中使用虚拟环境
               -files--settings--Project--Project Interpreter--add选择虚拟环境路径下的python.exe即可

    二、Django 2.0 和Django 1.0 路由层的区别

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

      re_path

      与URL的用法相同,并且分组出来的数据也是字符串类型

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

      path

      path是属于2.0新增的,传的路径,是准确路径

    path('准确路径 | 转化器', 视图函数,参数,别名),
    #转化器由<>包裹,包含<转化器类型:变量>,若没有转化器,将匹配任何字符串
    path('test/<path:mouth>', 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将请求报文中的请求行、首部信息、内容主体封装成 HttpResquest 类中的属性

    #常用属性
    # 前台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对象

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

    1. HttpResponse():括号内直接跟一个具体的字符串作为响应体返回
    2. render():将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
    3. 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)

    JsonRespons对象

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

    from django.http import JsonResponse
    def test(request):
        dic={'name':'xgp','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)和FBV基于函数的视图(Function base view)

    from django.views import View
    class AddPublish(View):
        def dispatch(self, request, *args, **kwargs):
            print(request)
            print(args)
            print(kwargs)
            # 可以写类似装饰器的东西,在前后加代码
            obj=super().dispatch(request, *args, **kwargs)
            return obj
    
        def get(self,request):
            return render(request,'index.html')
        def post(self,request):
            request
            return HttpResponse('post')

    五、简单的文件上传

    前端

    <form action="" method="post" enctype="multipart/form-data">
    {# <form action="" method="post" enctype="application/x-www-form-urlencoded"> #}
        <input type="file" name="myfile">
        <input type="text" name="password">
        <input type="submit" value="提交">
    </form>

    后台

    
    
    from django.shortcuts import render, HttpResponse, redirect

    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: f.wirte(line) return HttpResponse('ok')
  • 相关阅读:
    linux内核initrd文件自定义方法
    Linux2.6 内核的 Initrd 机制解析
    Linux 系统裁剪笔记 4 (内核配置选项及删改)
    Linux 系统裁剪笔记 3
    Linux 系统裁剪笔记 软盘2
    Linux 系统裁剪笔记1
    如何获取Linux-gate.so.1动态库
    通过grub-install命令把grub安装到u盘
    爬虫之UserAgent用户代理
    爬虫之urllib包以及request模块和parse模块,爬虫之urllib.error模块
  • 原文地址:https://www.cnblogs.com/Mister-JH/p/9932060.html
Copyright © 2011-2022 走看看