再看Python基础知识
1. type 和 object的关系
(1)type 是object的类;(2)type继承了object; (3)type是type自己的类。
所有的类(包括type),除了object都继承自object。【object是所有类的基类,包括type】
2. 一切皆对象
对象对应的就是地址。例如不同类型的变量可以赋值,实现的本质,就是变量指向的是一个内存地址。
3.可变类型与不可变类型
-- 可变类型:字典、列表、集合
--不可变类型:数字、字符串、元组
注意:
(1)字典的key必须用不可变类型,可以hash。
(2)Python中的参数传递:python中参数传递都是copy一份传递过去,由于一切皆对象,传递过去的都是地址。python中区分可变与不可变类型,可变类型在函数中修改会影响原来的,不可变类型,不会影响原来的。
4.比较运算符(is 和 ==)
is比较的是id(id(值)),双等号比较的是值。
其id相同则值肯定相同,而值相同,其id则不一定相同。
5.字符编码
bit:比特位,0或者1。
byte:8个bit位(比特位)是一个byte,就是一个字节。
1个字节:在电脑初期,1个字节,2的8次方变化,就可以表示出 欧美 国家所有的字符(数字、字母、标点符号),这就是ASCII编码的由来。随着 电脑的在世界范围的推广,这显然不够。
gbk编码:计算机到了中国,为了更好的兼容汉字,就推出了gbk编码。
Unicode: 就像它的名字表示的,为世界伤所有的字符都分配了一个唯一的数字编号(戏称万国码)。这个编号范围从0x000000到0x10FFFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode。换句话说,Unicode ,在世界范围,统一了字符和数字的对应关系。16进制,就是4个字节。
utf-8(全称Unicode Transformation Format,即unicode的转换格式),utf-8是不定长的。存储中,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少字节。可以说,utf-8定义Unicode在硬盘上的具体存储方式。
那为何在内存中不直接使用utf-8呢?
utf-8是不定长的:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储 也就意味着如果用户输入的字符是:你y好,在内存中需要先经历计算的过程:“你”应该用3Bytes,“y”应该用1Bytes,“好”应该用3Bytes,
然后才能存储,所以内存中如果直接使用utf-8格式去存储字符,耗费的总时间=计算时间+存储时间,而内存中使用定长的unicode格式存储字符,就省去了计算时间,
所以内存中使用unicode来存储字符会浪费空间,但是会提升速度,这是一种用空间换时间的方法
更多内容请参阅--https://www.cnblogs.com/liuqingzheng/articles/17386883.html
6.闭包函数
闭包(closure)指的是在函数内部定义了另外一个函数,并返回了这个内部函数作为函数对象,同时还保存了外层函数的状态信息。这个内部函数可以依赖外层函数的变量和参数,而且外层函数返回的是这个内部函数的引用。这种在函数内部定义函数并返回的方式称为闭包。
(1)定义在函数内部;
(2)对外部作用域有引用(使用到了外部作用域的变量)。
【思想:在Python语言中,函数是一等公民,可以赋值给一个变量。】
装饰器是闭包函数的典型应用。
7.wsgi协议
WSGI(Web Server Gateway Interface)是Python Web应用程序和Web服务器之间的接口标准,它定义了一个简单的API,使得Python Web应用程序可以被部署在多种Web服务器上,而无需修改应用程序代码。
WSGI库是实现WSGI接口的Python库,它提供了开发Web应用程序和Web框架的工具和组件,包括路由、请求/响应对象、中间件、模板引擎等。
Django是一个强大的Web应用框架,也是基于WSGI标准实现的。Django提供了完整的MVC架构、ORM、路由、请求/响应对象、模板引擎等组件,同时也支持插件和扩展。
8.视图的结果形式---响应对象HttpResponse
view 视图 中返回结果的四种形式
- HttpResponse() ----响应多种数据类型
- JsonResponse() -----响应Json数据
- render() ----渲染响应HTML模板
- redirect() -----重定向
8.1 HttpResponse()
参数形式
HttpResponse(content, #响应体数据,返回给视图函数的内容 content_type=None,#响应体数据的类型, text/html文本 ---这个是默认、text/plain、css、js、xml、json status=None,#http响应状态码 404 200---200是默认 charset=None, *args, **kwargs)
例如 archry 系统中的一段代码 【https://gitee.com/rtttte/Archery/blob/master/sql/resource_group.py】
import simplejson as json
from django.http import HttpResponse
def group(request): """获取资源组列表""" limit = int(request.POST.get("limit")) offset = int(request.POST.get("offset")) limit = offset + limit search = request.POST.get("search", "") # 过滤搜索条件 group_obj = ResourceGroup.objects.filter(group_name__icontains=search, is_deleted=0) group_count = group_obj.count() group_list = group_obj[offset:limit].values( "group_id", "group_name", "ding_webhook" ) # QuerySet 序列化 rows = [row for row in group_list] result = {"total": group_count, "rows": rows} # 返回查询结果 return HttpResponse( json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True), content_type="application/json", )
8.2 JsonResponse()
将对象dump
成json
字符串,然后将此json
字符串封装成Response
对象返回给浏览器。
场景:前端需要Json数据,此时,后端通过此方法构造JSON数据响应给 前端。
Django提供了JsonResponse构造并响应Json数据:
(1)将响应数据转换为Json字符串;(2)设置相应头Content-Type为application/json;(3)默认情况下JsonResponse
只能对字典进行dump
,如果想要对非字典的数据进行dump
,那么需要给JsonResponse
传递一个safe=False
参数。
def test_jsonview(request): info_dict = {'name': 'tom', 'age': 18} ###字典形式 # json_str = json.dumps(info_dict) # resp = HttpResponse(json_str, content_type='application/json') resp = JsonResponse(info_dict) return resp
8.3 render()
render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
用途:结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
格式与参数
render(request, ###用于生成响应的请求对象。 template_name ###要使用的模板的完整名称,可选的参数 [, context]) ###添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
实例,来源于Archery 【https://gitee.com/rtttte/Archery/blob/master/sql/sql_workflow.py】
def alter_run_date(request): """ 审核人修改可执行时间 :param request: :return: """ workflow_id = int(request.POST.get("workflow_id", 0)) run_date_start = request.POST.get("run_date_start") run_date_end = request.POST.get("run_date_end") if workflow_id == 0: context = {"errMsg": "workflow_id参数为空."} return render(request, "error.html", context) user = request.user if Audit.can_review(user, workflow_id, 2) is False: context = {"errMsg": "你无权操作当前工单!"} return render(request, "error.html", context) try: # 存进数据库里 SqlWorkflow( id=workflow_id, run_date_start=run_date_start or None, run_date_end=run_date_end or None, ).save(update_fields=["run_date_start", "run_date_end"]) except Exception as msg: context = {"errMsg": msg} return render(request, "error.html", context) return HttpResponseRedirect(reverse("sql:detail", args=(workflow_id,)))
8.4 redirect()
跳转页面时使用,用来实现 【重定向】。
传递参数是要重定向的一个硬编码的URL或者 一个完整的URL。
【redirect 、前面例子中HttpResponseRedirect()、反向解析reverse() 以及啥是硬编码的URL,可以参照这个分享:https://www.jianshu.com/p/3d99ddd5148f
】
9.HttpRequest 类
可以阅读《https://www.cnblogs.com/liuqingzheng/archive/9509801.html》
10. sys.argv 用法
首先看下 sys。 “sys” 是 “system”,是一个系统模块,该模块提供了一些接口,用户访问python解释器自身使用和维护的变量,同时模块中还提供了一些函数。
而argv就是模块里的一个函数。“argv” 即 “argument value” 是一个列表对象,其中存储的是在命令行调用 python 脚本是提供的 “命令行参数”,即它包含了命令行传递给Python脚本的参数。
sys.argv是一个列表
sys.argv[0]是被调用的脚本文件名或全路径
sys.argv[1]就是我们从程序外部输入的第一个参数。
sys.argv[1:] 依次打印出输入的元素参数。