Django项目常见面试问题
匿名函数
a = lambda x:x+1
print(a(1))
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
parent.x = 3
print(Parent.x, Child1.x, Child2.x) 111 121 323
A0 = [i for i in range(10) if i % 2 == 0]
A1 = {i: i+2 for i in A0}
A2 = sorted(A0, reverse=True) A0 = [0, 2, 4, 6, 8]
A1 = {0:2,2:4,4:6,6:8,8:10}
A2 = [8,6,4,2,0]
a = [2, 5]
b = [a] * 4
b = tuple(b)
b[0][0] = 4
print(b)
print(a) ([4,5],[4,5],[4,5],[4,5])
[4,5]运算符来操作列表时浅拷贝,只拷贝最外边一层,内层还是原来的引用。
def decorate(func):
print("func")
def inner(**kwargs):
print("")
ret = func(**kwargs)
print("")
return ret
print('inner')
return inner
@decorate
@decorate
def func(**kwargs):
return kwargs func
inner
func
inner
import redis
redis_conn = redis.StrictRedis(host="127.0.0.1", port=6379)
try:
lock_num = lock_num = redis_conn.incr("lock", 1)
if lock_num == 1:
# 执行操作,拼接response
response
else:
return 404
finally:
redis_conn.incr("lock", -1)
return response 原理:redis是单线程的
目的,在分布式应用中,将并发变为串行,减少数据库压力,提升安全性能
string list hash set zset
def feibo(n):
a, b = 1, 0
for _ in range(n):
a, b = b, a + b
yield b

默认事务隔离级别是可重复读

def wrap(cls):
instance = {}
def inner(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return inner
@wrap
class A(object):
def __init__(self, name):
self.name = name


非对称性加密
一对公钥和一对私钥
用户和银行分别有自己的公钥
用户使用银行给的公钥对原文进行加密
银行可以用自己的私钥对密文进行解密
非对称加密速度很慢。
现实中加密方式的使用
用户使用对称加密,通过秘钥对原文进行加密
将秘钥使用非对称加密方式加密然后传给银行
银行使用秘钥解密
非对称性加密
一对公钥和一对私钥
用户和银行分别有自己的公钥
用户使用银行给的公钥对原文进行加密
银行可以用自己的私钥对密文进行解密
非对称加密速度很慢。
现实中加密方式的使用
用户使用对称加密,通过秘钥对原文进行加密
将秘钥使用非对称加密方式加密然后传给银行
银行使用秘钥解密
import threading
# 定义全局变量
g_num = 0
# 创建全局互斥锁
lock = threading.Lock()
# 循环一次给全局变量加1
def sum_num1():
# 上锁
lock.acquire()
for i in range(1000000):
global g_num
g_num += 1
print("sum1:", g_num)
# 释放锁
lock.release()
# 循环一次给全局变量加1
def sum_num2():
# 上锁
lock.acquire()
for i in range(1000000):
global g_num
g_num += 1
print("sum2:", g_num)
# 释放锁
lock.release()
if __name__ == '__main__':
# 创建两个线程
first_thread = threading.Thread(target=sum_num1)
second_thread = threading.Thread(target=sum_num2)
# 启动线程
first_thread.start()
second_thread.start()
def f(x, l=[]):
for i in range(x):
l.append(i*i)
print(l)
f(2)
f(3, [3,2,1])
f(3) [0, 1] [3,2,1,0,1,4] [0,1,0,1,4]
1.全局解释锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码
2.python语言和GIL并没有关系,是由于历史原因在Cpython解释器中难以移除GIL。
3.线程释放GIL锁的情况:在IO操作等可能引起阻塞的系统调用之前,可以暂时释放GIL,cpu会切换执行其他线程,
但在执行完毕后,必须重新获取GIL。python3使用计时器(执行时间达到阈值后,当前线程释放GIL)
如何解决GIL问题
1.换解释器,默认是Cpython,可以换成jpython
2.使用其他语言写其他线程。
3.进程+协程
结论:
1.Python使用多进程可充分利用多核cpu的资源
2.多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁。
为什么有了GIL锁多线程使用时还要使用互斥锁:
GIL锁不能保证一个线程是否执行完成,互斥锁可以保证一个线程执行完成之后解锁,让别的程序再加锁执行。
sum([i+3 for i in a[1::2]])
cookie Session:
优点:
简单方便,通用性好,可以存放敏感信息,可以灵活控制用户的状态
缺点:
每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言
session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须
要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。
这也意味着限制了应用的扩展能力。
CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
jwt机制:
优点:
不需要在服务端去保留用户的认证信息或者会话信息,减少服务器开销
基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
缺点:
已颁布分令牌无法主动让其失效(可以通过后端实现黑名单来实现,但其实黑名单的原理和cookie session其实
是一样的)
主要的核心组件:
序列化器、视图、视图集,结合django自带的model和url
使用drf其实已经不再符合django的mvt开发模式了
主要的功能:
分页、限流、权限、认证等
celery架构由三个模块组成:消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(
taskresult store)组成。
消息中间件(Broker): 消息中间人,是任务调度队列,是一个独立的服务,是一个生产者消费者模式,生产者把任务
放入队列中,消费者(worker)从任务队列中取出任务执行,任务的执行可以按照顺序依次执行也可以按照计划时间进行。
但是Broker本身不提供队列服务,所以要集成第三方队列,推荐使用RatbbitMQ或Redis.
任务执行单元(worker):即执行任务的程序,可以有多个并发。它实时监控消息队列,获取队列中调度的任务,并执
行它。
任务执行结果存储(task result store):由于任务的执行同主程序分开,如果主程序想获取任务执行的结果,
就必须通过中间件存储。同消息中间人一样,存储也可以使用RabbitMQ、Redis;另外,假如不需要保存执行的结果也
可以不配置这个模块。
中间件:允许开发人员在请求之前或之后进行相应的处理。 1.10之前,Django中间件注册`MIDDLEWARE_CLASSES`:
process_request
process_view
process_response
process_template_response
process_exception 1.10及之后,Django中间件注册`MIDDLWARE`:
def simple_middleware(get_response):
# 一次性配置和初始化。 def middleware(request):
# 在调用视图(以及稍后的中间件)之前
# 要为每个请求执行代码。 response = get_response(request) # 为每个请求/响应执行的代码
# 在调用视图之后 return response
return middleware

异步:多个任务之间没有先后顺序,可以同时执行有时候一个任务可能要在必要的时候获取另一个
同时执行的任务的结果,这个就叫回调!
阻塞:如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。
非阻塞:如果不会卡住,可以继续执行,就是说非阻塞的。
同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言
答celery可以 asyncio可以了解一下
日常分页SQL语句
select id,name,content from users order by id asc limit 100000,20
扫描100020行
如果记录了上次的最大ID
select id,name,content from users where id>100073 order by id asc limit 20
扫描20行。
26.Django Signals信号简单使用
1. 信号的定义
所有信号都是 django.core.signals.Signal
的实例。 providing_args
是一个列表,由信号将提供给监听者的参数名称组成。
from django.core.signals import Signal
# 1. 定义邮件发送信号
email_send = Signal(providing_args=['email'])
2. 信号处理函数的定义
信号处理函数一般定义在定义在子应用下的signals.py
文件中。
# 2. 处理函数定义
def send_email(sender, **kwargs):
"""email_send信号处理函数"""
# TODO: 可以在这里编写信号的处理代码
print('email_send信号处理函数被调用')
3. 信号的连接
信号连接就是将信号和处理函数对应起来,信号连接一般是在子应用配置类的ready
方法中进行操作。
class TestAppConfig(object):
# ...
def ready(self):
# 3. 信号连接
email_send.connect(send_email)
4. 信号发送
发出信号之后,信号连接的处理函数就会被调用。
email_send.send(sender='信号发出者', **kwargs)
27.django懒加载是什么?
答:懒加载:使用的时候再去加载。
1)数据库查询:
all,filter, exclude, order_by:返回查询集QuerySet
惰性查询:只有使用查询集中数据的时候才会进行数据库的查询。
2)项目配置信息
from django.conf import settings
28.Django请求的生命周期
请求生命周期:客户端发起请求->服务器响应完整过程
29.列举Django的内置中间件
SessionMiddleWare:session中间件
获取:request.session['<key>']
设置:request.session['<key>'] = '<value>' CsrfViewMiddleware:csrf保护中间件
每次请求之前,进行csrf的验证
process_view AuthenticationMiddleware:认证中间件
request.user:登录的用户对象
request.user:匿名用户类的对象
30.简述Django下(内建的)缓存机制
你的缓存配置是通过setting 文件的CACHES 配置来实现的:
CACHES保存位置:
1. 服务器内存(默认)
2. 保存到数据库的表中
3. 保存到文件中
4. 保存到内存型数据库:redis Memcached 缓存级别:
1. 整站缓存
2. 视图缓存
3. 模板片段缓存 底层缓存API:
from django.core.cache import cache
cache.set('<key>', '<value>'): 设置缓存
cache.get('<key>'): 获取缓存
cache.delete('<key>'): 删除缓存
Django项目常见面试问题的更多相关文章
- Flask项目常见面试问题
一.你的项目中缓存粒度是如何选择的? 缓存粒度一共分为4种. 1.缓存某个数值:一个键只保存一个值,性价比较低,使用率低,如果存储的话我们使用redis的String 2.缓存数据对象:数据库记录对应 ...
- Android开发面试经——6.常见面试官提问Android题②(更新中...)
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...
- Android开发面试经——5.常见面试官提问Android题①
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...
- Django项目部署到Apache服务器
本文讲述的是在阿里云服务器(ECS)上部署Django项目于Apache,服务器操作系统为ubuntu,公网Ip地址为123.56.30.151. 将Django部署到Apache服务器的原因 Dja ...
- Django项目实践4 - Django网站管理(后台管理员)
http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...
- Django项目实践4 - Django站点管理(后台管理员)
http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...
- Python 关于在ubuntu部署Django项目
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
随机推荐
- 点击复制文字到剪贴板兼容性安卓ios
一般那种活动H5分享可能会用到点击复制文字到剪贴板,很简单的功能 于是搜了一搜:js复制文字到剪贴板,可用结果大致分为两类: 一类是js原生方法,这种方法兼容性不好,不兼容ios: https://d ...
- win服务器 文件上传下载出现“未指定的错误” 解决方法汇总
环境 WIN平台IIS服务器 经常出现于ASPX页面 汇总 1.权限问题 出现场景 : 基于ACCESS数据库 原因解析 : 1.首先需要排除自身问题,例如建表使用关键字,格式错误,插入数据与 ...
- pycharm+gitee【代码上传下载】实战(windows详细版)
pycharm+gitee环境搭建好以后应该如何进行代码上传下载操作呢?举几个例子,此文会一直更新 环境:2019社区版pycharm+gitee+git 系统:windows系统 一.代码上传功能 ...
- PHP 之循环创建文件夹
/** * 循环创建文件夹 * @param string $dir 需要创建的文件夹路径 * @param integer $mode 文件夹权限 * @return bool 返回创建是否成功 * ...
- vscode插件开发之如何玩转vscode命令
这里以插件开发为例,VsCode之所以那么强大是因为它背后有千千万万的开发者们为其开发大量功能插件,WordPress同理. 那么如何玩转VsCode命令呢(以插件开发为例)? 官方文档必不可少 ht ...
- Java自己实现HTTP服务器来理解GET和POST区别
GET请求和POST请求有什么区别?GET请求的参数在URL的问号后面显示,而POST参数不在URL上:POST可以比GET请求更大的数据…一般的回答都是这样. 但是作为一个高端大气上档次的程序员 ...
- mysql 面试题 查询出表中某字段的重复值
users 表中有 两个字段 id 和 name 表数据大概如下: id name 1 AAA 2 BBB 3 CCC 4 AAA 请写查 ...
- Python面向对象编程核心思想
原文地址https://blog.csdn.net/weixin_42134789/article/details/80194788 https://blog.csdn.net/happyjxt/ar ...
- flask 开发接口测试平台
flask 开发接口测试平台 数据库,forms views 视图, 数据库如下: # encoding: utf-8 ''' @author: lileilei @file: models.py ...
- Oracle系列一 SQL语句基本概念和学习准备
DML: Data Manipulation Language 数据操纵语言DDL: Data Definition Language 数据定义语言DCL: Data Control Langua ...