Python之天地无极,乾坤借法

589 阅读9分钟

1 Python面向对象编程

Python的面向对象编程,就是将所有的事务都看成是对象,
面向对象程序设计好比在创造一个世界,你就是上帝,周围存在的事物就是对象,都可以被创造
有点:结局了程序的可扩展性问题
缺点:编程的复杂度远大于面向过程化

2 设计模式

单例模式:一个类中只有一个实例
工厂模式:定义一个用于创建对象的接口,让子类决定实例化那个类
装饰器模式:动态的给对象添加一些额外的职责

3 GIL锁

在CPython解释器中,无法利用多核优势实现任务的并行,所以我们看到的同时运行只是并发,并不是真正意义上的同时运行
为了保证多任务再对共享数据进行更改的时候发生数据污染或者错乱的问题,全局解释器锁就将多任务对共享数据的操作变成串行

GIL可以用多进程实现CPU密集型程序

4 haystack

haystack是Django一个实现全文检索的插件,导入django-haystack,然后在INSTALLD_APPS中价格‘haystack’,然后在setting中加入haystack等相关配置
在整个项目的url中,配置搜索功能的url路径
urlpatterns = [
  ...
  url(r'^search/', include('haystack.urls')),
]

5 WSGI

是描述web server 和web application之间通信的一种规范
WSGI server负责从客户端接收请求,将request转发给application,将application的response转发给客户端

6 Django请求的生命周期

当客户在浏览器中输入路由的时候,先调用本地DNS服务器将域名解析成ip地址,然后浏览器拿着ip地址以及路由和action,就是get请求还是post请求去经过wsgi,中间件,最后到达指定的url,url解析之后到视图层,去模型层那数据,最后返还给客户端响应

7 网络编程

说到网络编程就要说互联网的层级结构
物理层,物理链路层,网络层,网络传输层,应用层

物理层就是一台一台的计算机的硬件
物理链路层要保证有网卡
网络层上面有ip协议,保证一台计算机有一个ip地址
网络传输层上面是TCP/UDP协议
应用程上面是HTTP协议

说起TCP/UDP协议就要说三次握手和四次挥手

三次握手就是客户端炒服务端发送链接请求,服务端同意请求,客户端发送数据
四次挥手就是 客户端向服务端发送断开连接请求,服务端检查时候有为传输完,没有直接断开客户端的链接,有的话传输万再断开;服务端发送断开连接的请求,客户端同意请求,此致,一个网络传输断开

说起HTTP协议,HTTP协议是工作在应用层上用于客户端和服务端之间传输超文本的协议,称为超文本传输协议
HTTP协议的特性
1 基于TCP/IP协议上的应用层协议
2 基于请求、响应
3 无状态保存 自身不对请求,响应的这种状态进行保存,所以诞生了session和cookie
4 无连接: 限制每次链接只处理一个请求,收到客户端的应答立马断开连接

8 Django中间件的5个方法?以及Django中间件的应用场景?

在DJango中,中间件其实就是类方法,会在请求开始和结束后根据自己的规则在合适的时机执行中间件中相应的方法
process_request:  # 方法再请求到来的时候调用
process_response:  # 在执行完view数据准备即使那个response发送到客户端的时候执行

如果你想在请求到来的时候或者响应返回的时候做一些事情,那么就添加一个中间件或者理解为添加一个拦截器

9 FBV和CBV

FBV就是基于函数的视图,就是视图里面集成request

CBV就是基于类的视图,就是视图里面的类继承view

10 如何给CBV程序 添加装饰器

# 直接在类上添加
@method_decorator(wrapper,name='dispatch')
class Foo(View):
    def get(self,request):
        pass
def post(self,request):
        pass
    
添加装饰器前必须导入from django.utils.decorators import method_decorator
添加装饰器的格式必须为@method_decorator(),括号里面为装饰器的函数名
给类添加是必须声明name
注意csrf-token装饰器的特殊性,它只能加在dispatch上面

11 Django ORM

django直接查询出来的对象是queryset对象,一般是一个集合
filter  # 过滤
exclude  # 剔除
annotate  # 聚合
order_by  # 排序
reverse  # 反正
distinct()  # 取出查询结果中重复的行
values  # 迭代时返回的是字典,而不是模型实例对象
values_list  # 返回的是元组而不是字典


12 django orm 中三种能写sql的方法

# 1 直接使用orm来实现
Books.objects.filter(publish_name='清华大学出版社').extra(where={'price>60'})

# 2 使用raw
books = books.objects.rqw('select * from books')

# 自定义SQL
from django.db import connection  
connection.curseor()
cursor = excute('elect * from hello_author')
cursor.fethome()
cursor.fintchall()



13 F和Q的作用?

F查询允许操作某列值
from djangp.db.model import F,Q
Books.objects.ipdate(F('price')+20)

Q 对对象进行复杂查询 %与 |或 ~not的关系
search_obj=Asset.objects.filter(Q(hostname__icontains=keyword)|Q(ip=keyword))

14 value和value_list的区别

他们俩返回的都不是模型对象(queryset)

values是字典,values_list是元组

15 django rom如何批量创建数据

1 使用save()每次创建数据都会访问数据库
2 使用bulk_create,较少sql查询次数
querysetlist=[]
for i in range(10):
    auerysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)

16 Django的缓存系统

热点数据,经常查询的数据,短信验证码等

设置缓存

在settings.py中的CACHES中设置缓存,

1 pip install django-redis
2 在settings.py中配置CACHES
3 SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

4 使用缓存 
from django_redis import get_redis_connection
con = get_redis_connection()  # 实例化get_redis_connection
con.set(key,code)  # 设置缓存
con.expire(key,80)  # 为缓存添加有闲时间

con.get(key)  # 获取缓存中的值


17 db_first和code first

db first就是先创建数据库,然后反向生成model
code first就是先写model,然后生成数据库


根据数据库生成model

python manage.py inspectdb
python manage.py inspectdb > blogapp/models.py

18 Django orm和原生sql的优缺点?

Django orm的有点就是快速开发,隐藏了数据访问细节,将数据表和对象模型关联,实现对象关系映射,方便对象的迁移

sql的有点就是进行复杂的查询时更加的方便

sql的缺点是sql注入的问题

19 MVC和MTV

MVC就是模型,视图和控制器

MTV就是模型,模板,视图

20谈谈你对restful规范的认识

1  api与用户通信协议,总是使用HTTPs协议
2 应该尽量将api接口部署在域名下
3 应该将api的版本号放在URL中
4 URL中的节点均用名词表示
5 HTTP动词 GET POST DELET PUT
6 状态码 200 操作成功 201新用户创建或者修改成功
301 永久重定向 302 临时重定向
400 客户端错误 401 没有权限 402参数错误 403禁止访问 404 没有找到资源 
500 服务端错误



21 接口的幂等性是什么意思

无论调用多少次都只会产生相同的结果,比如咱们的get请求

22 HTTP协议和HTTPS协议的区别

http是以明文传输数据的,不适合传输一些敏感的信息,比如支付等

如果攻击者窃取了web浏览器和服务器之间的传输报文,就可以读懂其中的信息,

为了解决这些缺陷,需要使用另一种协议:HTTPS协议,在HTTP的基础上加上了SSL协议,通过证书来验验证服务器的身份,并未浏览器和服务器之间的通信加密

HTTP用的80端口,HTTPS用的443的端口

23 django models中null和blank得区别

null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空

blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填,比如 admin 界面下增加 model 一条记录的时候。直观的看到就是该字段不是粗体

24 ORM优化

1 添加外键
2 添加索引
3 避免重复查询,对于热点数据添加缓存

25 高并发和解决方案

高并发:
看起来是同时运行的,多个客户端都能同时拿到数据
1 从前端缓存,设置精灵图,
2 大文件压缩
3 在数据库和程序之间加一层,用redis做缓存,降低mysql数据库的压力
4 优化查询语句,添加索引
5 优化uwsgi
6 nginx做负载均衡,反向代理
7 将图片,视频等数据放到oss上




26 自定制频率组件

比如每分钟限制访问3次

1 制定一个字典,key是用户的ip,value是一个列表,元素是时间

2 当ip不在字典中,将ip加入到字典中,返回True,表示第一次访问

3 循环判断当前ip列表,当前时间减去列表的最后一个回见大于60s,pop掉该数据,这样表中就只有一分钟内的访问时间

4 判断列表小于3,返回True,通过

5判断等于3 ,Fan会False,阻拦

27 Django rest framework框架

路由层

from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('company',CompayVietSet)

视图层

from rest_framework import mixins, viewsets, status
from rest_framework.decorators import throttle_classes, action
from django.db import connection, transaction

class AccessoryViewSet(viewsets.ModelViewSet):
   	queryset = Accessory.objects.all().order_by('id')
    serializer_class = AccessorySerializer
    pagination_class = AccessoryListPagination
    authentication_classes = (JWTTokenUserAuthentication,)
    permission_classes = (IsAuthenticatedOrReadOnly,)

    def get_queryset(self):
        return queryset
    
    
     # 事务
	 @transaction.atomic
    # 实现FBV的视图
     @action(detail=False, methods=['GET', ], authentication_classes=[JWTTokenUserAuthentication, ], permission_classes=[IsAuthenticatedOrReadOnly, ])
    def market(self, request, *args, **kwargs):
        return Response({'code': '10001', 'data': {}, 'msg': str(e)})
    
    
        

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):

序列化组件

from rest_framework import serializers
class AccessorySerializer(serializers.ModelSerializer):
    accessory_img = serializers.CharField(read_only=True)
	brand = serializers.SerializerMethodField()
    class Meta:
        model = Accessory
        fields = ('id', 'category_name', 'accessory_img','brand')
    
    def get_brand(self,obj):
        return ''
    
    
        
        
    

model层

from django.db import models
class Company(models.Modesl):
    cimpany_id = models.IntegerField(verbase_name='XXX')
    
    class Meta:
        verbose_name = 'sss'
        verbose_name_plural = verbose_name
        db_table='company'

28 Django的乐观锁和悲观锁

悲观锁:认为一切的操作都是有害的,先获取锁,在进行操作,1锁2查3更新

乐观锁:认为所有的操作都是无害的,先修改,发现错误就回滚

Django ORM实现悲观锁

from django.db import transaction


@transaction.atomic
def post(self,request):
    
    # 获取参数
    # 获取保存点
    sid = transaction.savepoint()
    
    # 写入数据
    order_info = OrderInfo.objects.create(
            order_id = order_id,
            user = request.user,
            addr = address,
            pay_method = pay_method,
            total_count = total_count,
            total_price = total_amount
        )

    try:
        # 尝试查询刚创建的数据
    except :
        # 回滚到保存点
        transaction.rullback(sid)
 
        
    

Django ORM实现乐观锁

from django.db import transaction


# 乐观锁

class OrderCommitView(View):
    """乐观锁"""
    # 开启事务装饰器
    @transaction.atomic
	def post(self,request):
        # 获取参数
        。。。
        # 创建保存点
        sid = transaction.savepoint()
        
        #写入数据
        try:
            pass
        except:
            # 回滚到保存点
            transaction.savepoint_rollback(sid)