• 一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.


    一、虚拟环境

    '''
    解决版本共存
    
    1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境
    2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境)copy到需要指定长期使用的文件夹下
    3. 再次创建项目时,将该环境(指定长期使用的文件夹下Scripts文件夹中的python.exe文件)添加到pycharm环境选择(System Interpreter)中
    4. 为该环境添加需要处理的版本共存包
    '''

    二、路由配置主页与404

    '''
    路由匹配从上往下进行匹配,如果一轮都没有匹配成功,加/进行匹配
    路由层:
    from django.urls import path, re_path
    urlpatterns = [
        # 主页最上方配置
        re_path('^$', root, name="root"),
        re_path('^index/$', index),
        re_path('^home/$', home),
    
        # 其他路由...
    
        # 404配在最下方
        re_path('.*/$', error)
    ]
    视图层:
    from django.shortcuts import render, redirect, reverse
    # 主页
    def root(request):
        return render(request, 'root.html')
    def index(request):
        return redirect(reverse('root'))
    def home(request):
        return redirect(reverse('root'))
    # 404
    def error(request):
        return render(request, 'error.html')
    '''

    三、2.x路由分发

    '''
    1.无名称空间
    主路由:
    path('app01/', include('app01.urls'))
    子路由:
    path('test/', views.test)
    
    2.有名称空间 有名称空间,与1版本不同,要将名称空间名和视图函数名放到一个数组中去
    主路由:
    path('app01/', include(('app01.urls', 'app01'))),
    子路由:
    path('test/', views.test, name='test')
    模板层:
    {% url 'app01:test' %}
    
    '''

    四、伪静态

    '''
    动态页面:数据内容会发生变化的页面
    静态页面:数据内容不会发生变化的页面
    针对SEO(搜索引擎优化),静态页面更容易被搜索引擎网站收录
    伪静态就是将动态页面伪装成静态页面,容易被搜索引擎网站收录,从而增加搜索概率,提高流量
    通过.html来实现
    ''' ''' #起了路由别名: 路由层: url('^index/$', views.index), url('^article/(?P<id>(d+)).html/$', views.article, name='article') 视图函数层: def index(request): return render(request, 'index.html') def article(request, id): return render(request, 'article.html', {'id': id}) 模板层: index.html <a href="{% url 'article' 1 %}">第一篇文章</a> <a href="{% url 'article' 2 %}">第二篇文章</a> <a href="{% url 'article' 3 %}">第三篇文章</a> article.html <h1>第{{ id }}篇文章</h1> #没有起路由别名: 路由层: url('^index/$', views.index), url('^article/(?P<id>(d+)).html/$', views.article) 视图函数层: def index(request): return render(request, 'index.html') def article(request, id): return render(request, 'article.html', {'id': id}) 模板层: index.html <a href="/article/1.html/">第一篇文章</a> <a href="/article/2.html/">第二篇文章</a> <a href="/article/3.html/">第三篇文章</a> article.html <h1>第{{ id }}篇文章</h1> '''

    五、request对象

    '''
    请求/index/?abc=123
    1. method: 请求方式    
    2. GET: 存放get的请求数据   结果:<QueryDict: {'abc': ['123']}>
    3. POST: 存放post的请求数据(本质是从bdoy中取出来)
    4. body: post提交的数据(不能直接查看)
    5. path: 请求的路径,不带参数   结果:/index/      
    6. request.get_full_path(): 请求路径,带参数   结果:/index/?abc=123
    7. FILES: 文件数据
    8. encoding: 编码格式
    9. META: 数据大汇总的字典
    10.is_ajax(): 是否是ajax请求 #False
    '''

    六、FBV与CBV

    '''
    FBV:function base views 函数方式完成视图响应
    CBV:class base views 类方式完成视图响应
    '''
    '''
    注意:在settings.py下的中间件配置中找到含有csrf的那条代码,将它关闭这样就可以跳过post请求的安全认证

     Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了CBV。可以让我们用类写View。这样做的优点主要下面两种:

    1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
    2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
    请求/path/123
    视图层:
    from django.shortcuts import HttpResponse
    from django.views import View
    class CBVView(View):
        def get(self, request,id):
            print('get请求!',id) #id=123
            return render(request,'cbv.html')
        def post(self, request,id):
            print('post请求!',id) #id=456
            print(request.POST.get('msg',None)) #获取提交的数据
            return HttpResponse("响应post请求")
    路由层:
    url('^path/(?P<id>d+)/$', views.CBVView.as_views())
    
    模板层:
    <form action="/path/456/" method="post">
        <input type="text" name="msg">
        <input type="submit">
    </form>
    '''

    七、文件上传

    '''
    前端:upload.html页面
    1.往自身路径发送post请求,要将第四个中间件注释
    2.multipart/form-data格式允许发送文件
    3.multiple属性表示可以多文件操作 
    <form action="" method="post" enctype="multipart/form-data">
        <input type="file" name="files" multiple="multiple">
        <input type="submit" value="上传">
    </form>
    
    后台:re_path('^upload/$', upload)
    def upload(request):
        if request.method == "GET":  
            return render(request, 'upload.html')
        if request.method == "POST":
            # 如果一个key对应提交了多条数据,get取最后一个数据,getlist取全部数据
            last_file = request.FILES.get('files', None)
            files = request.FILES.getlist('files', None)
            
            # import django.core.files.uploadedfile.TemporaryUploadedFile
            # file是TemporaryUploadedFile类型,本质是对系统file类封装,就是存放提交的文件数据的文件流对象,file.name就可以获得字符串类型的file的名字
            for file in files:  
                with open(file.name, 'wb') as f:
                    for line in file:  
                    # 从file中去数据写到指定文件夹下的指定文件中,大文件用file.chunks()
                        f.write(line)
            return HttpResponse('上传成功')
            
            
    注意: ?拼接从get中拿数据,body中数据从post中拿
    '''
  • 相关阅读:
    C语言在32位和64位机器下数字数据类型的字节数取决于编译器和平台, 主要由编译器决定。
    [MySQL]表创建外键失败:ERROR 1005 (HY000): Can't create table (errno: 150)
    将Windows下磁盘出现黑色为分配区域变成绿色区域
    [git更新中]版本控制工具git初步使用
    [Python]python CGI脚本在apache服务器上运行时出现“Premature end of script headers”错误
    [MySQL]修改mysql数据库的root密码的方法
    网页表单中的汉字存储到数据库, 再从数据库中提取并显示到网页时碰到的乱码问题。
    将chrome浏览器的默认背景颜色修改为浅绿色,以减缓长时间看电脑的眼睛不舒服的问题
    获取百度音乐盒里歌曲的外部链接。
    [Apache]架设Apache服务器
  • 原文地址:https://www.cnblogs.com/lizeqian1994/p/10468790.html
Copyright © 2020-2023  润新知