系列文章目录 第一章 django安装与介绍
第二章 django基础使用
第三章 路由层
第四章 虚拟环境、django版本区别、视图层
第五章 模板层
第六章 模型层
文章目录
- 系列文章目录
- 一、虚拟环境
- 二、django版本区别
- 三、视图层
-
- 1.视图函数返回值
-
- 1.1 HttpResponse
- 1.2 render
- 1.3 redirect
- 2.JsonResponse对象
- 3.request对象常用方法
-
- 3.1 method
- 3.2 POST
- 3.3 GET
- 3.4 FILES
- 3.5 body
- 3.6 path
- 3.7 path_info
- 3.8 get_full_path
- 4. FBV与CBV
-
- 4.1 FBV
- 4.2 CBV
- 5.模板语法传值
-
- 5.1 传值的方式
- 5.2 传值的范围
一、虚拟环境 诸多项目在你的机器上如何无障碍的打开并运行
方式1:把所有需要用到的模块全部下载下来 如果有相同模块不同版本每次都重新下载替换
方式2:提前准备好多个解释器环境 针对不同的项目切换即可
此处可以使用pycharm创建新的环境变量
第一步创建新的环境
文章图片
第二步创建项目时使用新的环境
文章图片
二、django版本区别 django1.x与2.x、3.x有些许区别
路由层中:
1.x 的urls可以使用正则
2.x、3.x提供的path只能绑定url与对应视图函数
但re_path与1.x的urls具有一样的功能,甚至正则中的分组是可以指定类型的。
1.x的urls中正则中的分组只能为字符串变量
urls(r"^index/(?P\w*)", views.index) #此处的username为str
2.x、3.x之中的path提供了转换器用来替代正则中的无名有名分组,并且转换器可以定制变量的类型
path("index/", views.index) #此处的num为int
django针对转换器提供了五种供path使用
三、视图层 1.视图函数返回值 视图函数必须返回一个HttpResponse对象
视图层中返回HttpResponse对象的方法有三个HttpResponse、render、redirect
1.1 HttpResponse
HttpResponse方法返回的对象就是HttpResponse对象,该方法是HttpResponse对象自己。
class HttpResponse(HttpResponseBase):
....
1.2 render
render方法返回的对象就是HttpResponse对象。
def render(request, template_name, context=None, content_type=None, status=None, using=None):
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
1.3 redirect
redirect方法返回的对象是HttpResponse对象。
def redirect(to, *args, **kwargs):
if kwargs.pop('permanent', False):
redirect_class = HttpResponsePermanentRedirect
else:
redirect_class = HttpResponseRedirectreturn redirect_class(resolve_url(to, *args, **kwargs))class HttpResponsePermanentRedirect(HttpResponseRedirectBase):
status_code = 301class HttpResponseRedirect(HttpResponseRedirectBase):
status_code = 302class HttpResponseRedirectBase(HttpResponse): #通过查看源代码知道redirect最终返回的还是HttpResponse对象
2.JsonResponse对象 django对json序列化的数据类型的范围做了扩充,从而诞生了JsonResponse,通过查看源码可以了解到django框架也是使用基础的json来实现的。
class JsonResponse(HttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
if json_dumps_params is None:
json_dumps_params = {}
kwargs.setdefault('content_type', 'application/json')
data = https://www.it610.com/article/json.dumps(data, cls=encoder, **json_dumps_params)#此处对json进行了扩充
super(JsonResponse, self).__init__(content=data, **kwargs)
3.request对象常用方法 3.1 method
该方法用于获取请求的类型,获取的值为大写的
3.2 POST
获取POST请求附带的数据,附带的数据为字典类型
request.POST["name"] # 获取对应的值
request.POST.get("name") # 获取对应的值
request.POST.getlist("name") # 获取对应的值,但类型为list
3.3 GET
获取url中?后的参数
request.GET["name"] # 获取对应的值
request.GET.get("name") # 获取对应的值
request.GET.getlist("name") # 获取对应的值,但类型为list
3.4 FILES
form表单上传的数据中如果含有文件 那么需要做以下几件事
- method必须是post
- enctype必须修改为multipart/form-data,默认是application/x-www-form-urlencoded
- 后端需要使用request.FILES获取
file_obj = request.FILES # 获取文件数据
file_obj.get("file") # 获取其中的一个文件
file_obj["file"] # 获取其中的一个文件
file_obj["file"].name # 获取文件的文件名
3.5 body
存放的是接收过来的最原始的二进制数据,request.POST、request.GET、request.FILES这些获取数据的方法其实都从body中获取数据并解析存放的
request.body
3.6 path
获取url
request.path
3.7 path_info
获取url
request.path_info
3.8 get_full_path
获取url并且还可以获取到url中?后面携带的参数
request.get_full_path()
4. FBV与CBV 4.1 FBV
【web框架|django框架——虚拟环境、django版本区别、视图层】FBV:基于函数的视图
url(r’^index/',函数名)
1.在视图层创建函数
def myviews(request):
req_name = request.method
if req_name == "POST":
return render(request, "myviews.html", {"req_name": req_name})
return render(request, "myviews.html", {"req_name": req_name})
2.创建对应的页面
Title - 锐客网
{{ req_name }}
3.设置路由
url(r'^myviews/', views.myviews),
FBV运行过程:
启动django,前端访问myviews通过路由运行视图函数最终返回一个HttpResponse对象
def render(request, template_name, context=None, content_type=None, status=None, using=None):
...
return HttpResponse(content, content_type, status)#返回了一个HttpResponse对象
4.2 CBV
1.在视图层创建类
from django import views
class myViews(views.View):def get(self, request):
return render(request, "myviews.html", {"req_name":"现在是GET请求"})def post(self, request):
return render(request, "myviews.html", {"req_name":"现在是POST请求"})
2.创建对应的页面
Title - 锐客网
{{ req_name }}
3.设置路由
url(r'^myviews/', views.myViews.as_view()),
CBV运行过程:
1.django启动时,路由开始运行,此时的views.myViews.as_view()中的as_view方法先运行返回一个view
# 以下代码为as_view()运行过程的简略代码
@classonlymethod
def as_view(cls, **initkwargs):
... # 别的一些代码
def view(request, *args, **kwargs):
... # 别的一些代码
return self.dispatch(request, *args, **kwargs)
... # 别的一些代码
return view
# 此时as_view最终返回了一个view,实质上也就是dispatch
2.当django收到请求myviews页面时,正式调用view,此时的view开始运行
最终返回一个HttpResponse对象
# 以下代码为view运行过程的简略代码
def view(request, *args, **kwargs):
...
return self.dispatch(request, *args, **kwargs)#返回了一个dispatch# dispatch运行
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) #返回了一个handler# 通过观看代码发现handler中最重要的部分为http_method_not_allowed
# 然后http_method_not_allowed运行
def http_method_not_allowed(self, request, *args, **kwargs):
...
return http.HttpResponseNotAllowed(self._allowed_methods())# 返回了一个http下的HttpResponseNotAllowed
class HttpResponseNotAllowed(HttpResponse):
....
# 运行到最后是一个继承了HttpResponse的类,所以最后整个流程返回依然是一个HttpResponse对象
5.模板语法传值 django提供的模板语法只有两个符号
{{}}:主要用于变量相关操作(引用)
{%%}:主要用于逻辑相关操作(循环、判断)
5.1 传值的方式
django向模板传值需要在视图层中进行
django模板语法针对容器类型的取值只有一种方式:句点符
{* 需要的值没有嵌套时 *}
{* 视图函数传来的值 {"name":"kdq", "age":18} *}
{{ name }} {* 直接拿存放数据时的key即可 *}
{* 需要的值嵌套时 *}
{* 视图函数传过来的值 {"data":{"name":[ {"bbc":552, "aac":667, "value": 888} ,{"age":[1,2,3]} , {"hoby":["eat", "sleep", "play"]} ] } } *}
{{ data.name.0.vlaue }}
传值方式1:指名道姓的传 适用于数据量较少的情况,优点在于节省资源
def login(request):
name = "kdq"
age = 18
hoby = ["eat", "sleep", "play"]
return render(request, "login.html", {"name":name, "age":age, "hoby":hoby})
# 对应前端使用时{{ name }} 即可
传值方式2:打包传值 适用于数据量较多的情况,缺点浪费资源
def login(request):
name = "kdq"
age = 18
hoby = ["eat", "sleep", "play"]
return render(request, "login.html", locals())
# 对应前端使用时{{ name }} 即可
5.2 传值的范围
基本数据类型都可以
以函数名为值传参:
模板语法会自动加括号执行并将函数的返回值展示到页面上
不支持传参(模板语法会自动忽略有参函数)
以文件名为值传参:
直接显示文件IO对象
以类名为值传参:
自动加括号实例化成对象
以对象名为值传参:
直接显示对象的地址 并且具备调用属性和方法的能力
推荐阅读
- web框架|django框架——django基础使用
- django框架|django——版本问题、启动问题、安装、基础使用、应用app、django主要文件介绍
- 网络编程|网络编程——socket套接字、黏包
- python——用Turtle画画写名字
- 软件测试|【码住收藏】软件测试报告模板范文来了——优秀测试报告模板流程
- 软件测试|十分钟带你看懂——Python测试框架之pytest最全讲
- 技术交流|Python图像处理丨图像缩放、旋转、翻转与图像平移
- Python数据分析基础-2Python标量类型
- python——rsa和aes加解密