路由分发
# 目前来说,一个django项目只有一个总路由文件 urls.py
# 由于django项目可以有多个app应用,每一个App应用都可以有自己的路由文件,称为子路由
# 在应用里面默认是没有urls.py的,需要手动创建一个
'''为什么要路由分发? 当总路由中有非常多的路由时候,就会显得杂乱无章,我们这个时候就可以按照应用进行路由分发,把不同的路由写到对应的应用里面去,然后总路由文件做分发处理'''
# 第一种方式
# 总路由做分发
# app01/reg/
url(r'^app01/', include(app01_urls)),
# app02/reg/
url(r'^app02/', include(app02_urls)),
# 第二种方式
# 总路由做分发
# app01/reg/
# url(r'^app01/', include(app01_urls)),
url(r'^app01/', include('app01.urls')),
# app02/reg/
# url(r'^app02/', include(app02_urls)),
url(r'^app02/', include('app02.urls')),
'''路由中的后缀坚决不能加 $'''
名称空间
'''路由分发之后 针对相同的别名能否自动反向解析出不同的应用前缀
默认情况下是无法直接识别应用前缀的'''
如果想要正常识别区分有两种方式
方式1:名称空间
总路由
path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
反向解析
reverse('app01:index_view')
reverse('app02:index_view')
方式2:别名不冲突即可
多个应用别名不冲突可以用应用名作为别名的前缀
path('index/', views.index, name='app01_index_view')
path('index/', views.index, name='app02_index_view')
虚拟环境
项目1需要使用:django1.11 python38
项目2需要使用:django2.22 pymysql requests python38
项目3需要使用:django3.22 request_html flask urllib3 python38
实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配!!!
虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器)
命令行的方式: python -m venv pyvenv38
注意:python命令此处不支持多版本共存的操作 python27 python36 python38
激活
activate
关闭
deactivate
pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com
伪静态的概念
# 静态文件:写死的一些东西
# 伪静态
把一些动态的网页伪装成静态网页
'''为什么要伪装呢?'''
# 其实是因为静态的网页更加容易被搜索引擎抓取到
# 搜索引擎其实是一个巨大的爬虫程序,你在百度中搜索一个美女,百度拿着这个关键词去网络上去爬取数据,然后把爬到的数据处理好,返回到百度的页面
# 为了把我们的网页被搜索引擎更好的抓取到
seo----------------->免费的
sem------------------>收费的----------------->广告--------->rmb
虚拟环境
项目1需要使用:django1.11 python38
项目2需要使用:django2.22 pymysql requests python38
项目3需要使用:django3.22 request_html flask urllib3 python38
实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配!!!
虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器)
命令行的方式: python -m venv pyvenv38
注意:python命令此处不支持多版本共存的操作 python27 python36 python38
激活
activate
关闭
deactivate
pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com
视图层之必会三板斧
用来处理请求的视图函数都必须返回HttpResponse对象 完全正确
class HttpResponse:
pass
return HttpResponse()
def render():
return HttpResponse()
return render()
def redirect():
redirect_class = 类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
JsonResponse对象
from django.http import JsonResponse
def index_func(request):
# return HttpResponse('哈哈哈')
# return render()
# return redirect()
# 返回给浏览器一个json格式的字符串
user_dict = {'name': 'jason老师', 'age': 18}
# import json
# user_json = json.dumps(user_dict, ensure_ascii=False)
# return HttpResponse(user_json)
return JsonResponse(user_dict)
ps:以后写代码很多时候可能需要参考源码及所学知识扩展功能
class JsonResponse():
def __init__(self,data,json_dumps_params=None):
json.dumps(data,**json_dumps_params)
#字典前面加**可以把键值对转换成关键字参数
'''
JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False
'''
视图层之request对象获取文件
form表单携带文件类型的数据需要做到以下几点
1.method必须是post
2.enctype必须是multipart/form-data
django后端需要通过request.FILES获取文件类型的数据
ex:
file_obj = request.FILES.get(文件字典的K)
file_obj(文件名称)
with open(r'%s'%file_obj.name,'wb') as f:
for line in file_obj: #文件对象支持for循环一行行读取内容
f.write(line)
视图层之FBV与CBV
FBV
基于函数的视图
def index(request):return HttpResponse对象
CBV
基于类的视图
from django import views
class MyLoginView(views.View):
def get(self, request):
return HttpResponse('from CBV get function')
def post(self, request):
return HttpResponse('from CBV post function')
path('login/', views.MyLoginView.as_view())
会自动根据请求方法的不同自动匹配对应的方法并执行