ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python学习-day64-Djiango续2

2019-02-28 20:51:22  阅读:240  来源: 互联网

标签:index app01 Python request html day64 path 路由 Djiango


一、复习

1. url函数:url('^index/$', views.index, {'msg': '默认参数'}, name="路由别名")
2. 有名无名分组: /page/10/1
    -- 路由层:'^page/(\d+)/(\d+)/$'  视图层:def page(request, n1, n2)  n1=10, n2=1
    -- 路由层:'^page/(?P<num>\d+)/(?P<id>\d+)/$' 视图层:def page(request, id, num)  num=10, id=1
    -- 注:有名无名不能混用
3. 路由分发:
    -- 有多个app,1.创建app: startapp app_name -> 2.配置,在settings中配置app信息 -> 在应用自己目录下创建urls.py
    -- 主路由:url('^app01/', include('app01.urls', namespace='app01'))
    -- 子路由:url('^login/$', views.login, name='login')
    -- 访问:/app01/login/
4. 反向解析: {% url 'app01:login' [参数们] %}  reverse('app01:login'[, args=() | kwagrs={}])
5. 2.x新特性: url, include, re_path, path
    -- re_path同url
    -- path采用的是绝对字符串匹配 path('index/', views.index, name='index')
    -- path: str|int|slug|uuid|path 语法:path('page/<int:id>/', ...)
    -- 自定义转化器:1.按格式自定义转化器类 2.注册自定义转化器类并起转化器名 3.在路由中用转化器名进行匹配
6. 多app共存问题
    -- 路由问题:import app01.views as app01_view | 路由分发
    -- 模板问题:
        -- 在templates文件夹下建立与应用名相同的文件夹,将该应用的模板文件放置自己应用名文件夹下,render(request, 'app01/login.html')
        -- 在各自app应用下建立templates文件夹,再在templates下建立与应用同名文件夹,放置自己的模板页面,render(request, 'app01/login.html')
        -- 模板页面命名:app01_login.html

二、虚拟环境

解决版本共存
​
1. 用pycharm选择virtualenv创建一个纯净环境
2. 将环境copy到需要指定长期使用的文件夹下
3. 再次创建项目时,将该环境添加到pycharm环境选择中
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'))   # reverse括弧中跟的参数为路由的别名
def home(request):
    return redirect(reverse('root'))
# 404
def error(request):
    return render(request, 'error.html')
​
# redirect: 返回的参数可以可以是:
# 一个模型: 将调用模型的get_absolute_url()函数;
# 一个视图, 可以带有函数: 可以使用urlresolvers.reverse来反向解析名称;
# 一个绝对的或相对的URL, 将原封不动的作为重定向的位置.
# redirect("/index/") | redirect("http:127.0.0.1:8000/index/")

五、2.x路由分发

1.无名称空间
主路由:
path('app01/', include('app01.urls'))
子路由:
path('test/', views.test)
​
2.有名称空间
主路由:
path('app01/', include(('app01.urls', 'app01')[, namespace="app01"])), #[]中的可以不用写
子路由:
path('test/', views.test, name='test')
模板层:
{% url 'app01:test' %}

六、伪静态

动态页面:数据内容会发生变化的页面
静态页面:数据内容不会发生变化的页面
针对SEO(搜索引擎优化),静态页面更容易被搜索引擎网站收录
伪静态就是将动态页面伪装成静态页面,容易被搜索引擎网站收录,从而增加搜索概率,提高流量
​
路由层:
url('^index/$', views.index),
url('^article/(?P<id>(\d+)).html/$', views.article, name='article') # url中加上.html(访问时也需要有后缀如此处http://127.0.0.1:8000/article/2.html)变成伪静态页面.
​
视图函数层:
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>

 

七、request对象

1. method: 请求方式  #request.method
2. GET: get请求的参数  #request.GET.get("k")
3. POST: post请求的参数(本质是从bdoy中取出来)  #request.POST.get("k")
4. body: post提交的数据(不能直接查看)
5. path: 请求的路径,不带参数
6. request.get_full_path(): 请求路径,带参数
7. FILES: 文件数据
8. encoding: 编码格式
9. META: 数据大汇总的字典

 

八、FBV与CBV

FBV:function base views 函数方式完成视图响应
CBV:class base views 类方式完成视图响应
​
视图层:
from django.shortcuts import HttpResponse
from django.views import View
class CBVView(View):
    
    def get(self, request):
        return HttpResponse("响应get请求")
    
    def post(self, request):
        return HttpResponse("响应post请求")
路由层:
url('^path/$', views.CBVView.as_views())

 

九、文件上传

前端: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类封装,就是存放提交的文件数据的文件流对象
        for file in files:  
            with open(file.name, 'wb') as f:
                for line in file:  # 从file中去数据写到指定文件夹下的指定文件中
                    f.write(line)
        return HttpResponse('上传成功')

 


标签:index,app01,Python,request,html,day64,path,路由,Djiango
来源: https://www.cnblogs.com/peng-zhao/p/10452997.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有