Django(四)

Django(四)

路由层

url函数

"""以下是Django1中的,2和3中是精准匹配不是模糊匹配"""
# 路由匹配的原则,就是在列表中的路由逐个往下匹配,如果找到立刻执行对应的函数,不继续往下匹配

# 路由后缀的/是Django自动添加的,默认情况,可以修改参数来修改默认
APPEND_SLASH = True
APPEND_SLASH = False  # 改成这个就不会默认加/了 

# url函数的第一个参数是支持正则的

url(r'^$',views.home)  # 首页的路由

无名分组

"""
	把一个正则表达式用括号括起来
"""
# 需要在视图函数加上参数名,推荐加*args
url(r'^test/(\d+)/$',views.test)  # 把匹配的内容当做位置参数传给视图函数
url(r'^test/(\d+)/(\d+)/(\d+)/$',views.test)

有名分组

"""
	把一个正则表达式用括号括起来,并且给他一个名字
"""
# 需要在视图函数加上参数名,推荐加**kwargs
url(r'test/(?P<yesr>\d+)/$',views.test)  # 把匹配的内容当做关键字参数传给视图函数
url(r'test/(?P<yesr>\d+)/(?P<yesr>\d+)/(?P<yesr>\d+)/$',views.test) 

# 无名有名分组,都可以多次使用但是不要混合使用,不用具体的参数名,用*args,和**kwargs可以接收,但是没意义

反向解析

# 可以给每一个路由起一个别名,然后通过一些方法,反向解析这个路由名字,可以得到这个路由对应的地址

# 后端反向解析:
	from django.shortcuts import reverse
	首先在url中写上path('index/', views.index, name='666'),
	然后在views中别的函数中print(reverse('666'))
    最后输入写上reverse的地址
    
# 前端反向解析:
    在html文件中写<a href="{% url '666' %}">123456</a>
    
# 无名的后端反向解析:
	url(r'^test/(\d+)/$',views.test,name='xxx')
    print(reverse('xxx',args=(1231321, )))
    # 需要指定一个参数,这个参数必须符合正则表达式
    
# 无名的前端反向解析:
	url(r'^test/(\d+)/$',views.test,name='xxx')
	在html文件中写<a href="{% url 'xxx' 111 %}">123456</a>  # 一般是传主键ID
    
# 有名的后端反向解析:
	url(r'test/(?P<yesr>\d+)/$',views.test, name='xxx')
    print(reverse('xxx',kwargs={'year':2000}))
    
# 有名的前端反向解析:
	url(r'test/(?P<yesr>\d+)/$',views.test, name='xxx')
    在html文件中写<a href="{% url 'xxx' year=2023 %}">123456</a>

路由分发

# 目前来说一个DJango文件只有一个总路由urls.py
# 由于Django项目可以建多个app应用,每一个应用都可以有自己的路由文件,称为子路由
# 在应用里默认没有urls.py需要手动创建
# 当总路由中有很多的路由时,就会很乱,就需要按照应用进行路由分发,把不同的路由写到对应的应用中,总路由文件做分发处理

# 第一种分发方式:
	path('app01/', include(app01_u)),
    path('app02/', include(app02_u)),
# 第二种分发方式:
	path('app01/',include('app01.urls'))
    
# 如果是在Django1中坚决不能在路由后缀加$

伪静态的概念

# 静态文件:一些写死的东西
# 伪静态:把一些动态的网页伪装成静态的


"""
	静态网页更加容易被搜索引擎抓取到
	搜索引擎其实是一个巨大的爬虫程序
	为了我们的网页被搜索引擎更好的抓取
	seo  >>>  免费的
	sem  >>>  收费的(广告)
	path('test.html/', views.test),就是加上.html
"""

虚拟环境

# 正常开发,应该给每个项目都配备一个虚拟环境
"""
	相当于一个纯净的python解释器
	针对一个新项目,解释器上只装跟项目有关的模块
"""
# 虚拟环境别创建过多,会占用资源

Django1和2的区别

"""
	1. Django1中路由是url	Django2中路由是path
	2. 虽然path不支持正则,但是也可以使用	re_path相当于url,支持正则
		re_path(r'^test/$',views.test)
	3. path支持五种转换器:  掌握str int path
        ● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
        ● int,匹配正整数,包含0。  path('qwe/<int:id>', views.qwe),
        ● slug,匹配字母、数字以及横杠、下划线组成的字符串。
        ● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
        ● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
	4. 创建表关系,需要指定on_delete参数
"""
# 在Django2中导入url就也可以在Django2中使用url了
    from django.conf.urls import url
    url('^test/$', views.test)

视图层

# 三板斧:
	render
	HttpResponse
	redirect
# 本质上都是HttpResponse

JsonResponse

# json: 可以跨语言传输{"username":"kevin"}

'''
	python中:
        序列化:   json.dumps()
        反序列化:  json.loads()
    js中:
    	序列化:   JSON.stringify()
        反序列化:   JSON.parse()
''''

# Django中的json:
	from django.http import JsonResponse

    def ab_json(request):
        dic = {
            'name': 'zhangsan',
         #  'name': '张三',
            'age': 18,
        }
        l = [1, 2, 3, 4, 5]
        s = JsonResponse(dic)
        s1 = JsonResponse(l, safe=False)  # 序列化非字典类型要将safe=False
        # s = JsonResponse(dic, json_dumps_params={'ensure_ascii':False})  想要序列化中文,就要加这个json_dumps_params={'ensure_ascii':False}
        return HttpResponse(s)
    #{"name": "zhangsan", "age": 18}

django中如何上传文件

# 表单上传文件需要:
	# 1. method="post"
	# 2. enctype---->form-data
    
def file(request):
    print(request.POST)  # 接收用户提交的数据 <QueryDict: {'username': ['555']}>
    print(request.FILES)  # 接收用户提交的文件 <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 2.jpg (image/jpeg)>]}>
    file_file = request.FILES.get('myfile')  # 获取文件的数据
    with open(file_file.name, 'wb')as f:
        for line in file_file:  # 逐行写入文件
            f.write(line)
    return render(request, 'file.html')
posted @ 2023-04-24 21:12  橘子熊何妨  阅读(28)  评论(0)    收藏  举报