url函数。有名无名分组,别名, 路由分发,反向解析,2.x新特性,伪静态,上传文件

时间:2022-10-13 04:37:46

1,from djiango.conf.urls import url

from  djiango.urls  import include,path,re_path 

url('^index/$',view .index ,{'msg':msg})

在2.x新版本下

有了path,re_path,path是默认将里面当字符串匹配,re_path是用法同url  并且namespace设置  (include('app.urls','app'), namespace=app

可将404设置放在最后^/$  

有五个类型转换器

<str:msg>  <int:msg>  <;msg>

str:匹配除路径分隔符(/)外的字符串,默认

-- int:匹配自然数

-- slug:匹配字母、数字、横杠及下划线组成的字符串

-- uuid:匹配uuid形式的数据

-- path:匹配任何字符串,包括路径分隔符(/) (不能用?)

 index/<str:msg>/  msg在视图函数接受作为参数

主路由分发不能用正则语法2.x用path 

 默认匹配不上加/匹配。可设置APPEND_FLASH=FALSE取消   加参数后视图函数  , kwargs={'msg':msg}

2.有名无名分组  (不可以混用)

^page/(\d+)/$  视图层 def index(request,n)   reverse('index', args=(n,)

^page/(?P<num>\d+)/$  视图层 def index(request,num)     url=reverse('index(别名)',kwargs={'num':num}  return (url) 加别名才能反向解析

3,

url(r'^app/',include('app.urls',namespace= 'app')),

 创建多个app

在tool下startapp app01

terminal下     django-admin startapp app01 或者python3 manage.py startapp app02

4数据库

先在右侧添加数据库,在dj01的init下 import pymysql    mysql.install_as_MySQLdb()

然后迁移数据库tool下makemigrations   migrate

5自定义转换器

 

语法:

1.自定义类

# 匹配11位的185电话

class CVT185phone:

# 匹配过程

    regex = '185\d{8}'

    def to_python(self, value):

        return int(value)

# 反解过程

    def to_url(self, value):

        return '%11d' % value

 

# 在主路由中

from django.urls import register_converter

from 所在路径 import CVT185phone

register_converter(CVT185phone, 'phone185')

 

path('page/<phone185:msg>/', views.page, name="pages")

'''

 

6上传文件

前端: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('上传成功')
'''
```

 

 

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

## 八、FBV与CBV

```python
'''
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())

 

7.伪静态页面

动态页面:数据内容会发生变化的页面
静态页面:数据内容不会发生变化的页面
针对SEO(搜索引擎优化),静态页面更容易被搜索引擎网站收录
伪静态就是讲动态页面伪装成静态页面,容易被搜索引擎网站收录,从而增加搜索概率,提高流量
'''

'''
路由层:
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})

<a href="app01/1.html">第一篇文章</a>
<a href="app01/2.html">第二篇文章</a>
<a href="app01/3.html">第三篇文章</a>
<a href="{% url 'article' 4 %}">第四篇文章</a>