答: django-admin startproject [项目名称]
python manage.py startapp [应用app名]
答: 文件组成:manage.py、__init__.py、setting.py、urls.py、wsgi.py
manage.py
:项目运行的日寇,指定配置文件路径。与项目同名的目录,包含项目的配置文件
__init__.py
:空文件,作用是这个目录可以被当作包使用
settings.py
:是项目的整体配置文件
wsgi.py
:是项目与WSGI兼容的web服务器
答:
MVC:M(model)模型,作用:与数据进行交互;V(view)视图,作用:负责产生HTML页面;C(controller)控制器,作用:接收请求,进行处理,与M和V进行交互,返回应答
MVC步骤:假设是一个注册页面,用户点击注册按钮,要把注册的信息发送给网站服务器;controller控制器接收到用户的注册信息,controller会告诉model层将用户的注册信息保存到数据库;model层将用户的注册信息保存到数据库;数据保存之后将保存的结果返回给model模型;model层将保存的结果返回给controller控制器;controller控制器收到保存的结果之后,告诉view视图,view视图产生一个HTML页面;view将产生的HTML页面的内容返回给controller控制器;controller将HTML页面的内容返回给浏览器;浏览器接收到服务器controller返回的HTML页面进行解析展示。
MVT:M(model)模型,作用:与数据库进行交互;V(view)视图,作用:接收请求,处理请求,与M和T 进行交互,返回应答;T(template)模板,作用:产生HTML页面
MVT步骤:结社是一个注册页面,用户点击注册按钮,将要注册的内容发送给网站的服务器;view视图接收到用户发来的注册信息,view告诉model将用户的注册信息保存进数据库;model层将用户的注册信息保存到数据库;数据库将保存的结果返回给model层;model层将保存的结果给view视图;view视图告诉template模板产生一个HTML页面;template生成的HTML内容返回给view视图;view将HTML页面内容返回给浏览器;浏览器拿到view返回的HTML页面内容进行解析展示。
持久化:把数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储到磁盘文件、XML数据文件中等等
持久层:专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。
ORM:即object-relationl mapping,作用是在关系型数据库和对象之间作一个映射,这样就可以在操作数据库的时候不用和复杂的SQL语句打交道,只要像平时操作对象一样操做就可以了。
ORM优缺点:优点:开发效率高;数据访问更抽象、轻便;支持面向对象封装;
缺点:降低程序的执行效率;思维固定化
答 :
字段查询
all() 返回模型类对应表格中的所有数据
get() 返回表格中满足条件的一条数据,如果查到多条数据,抛出异常MultipleObjectsReturned;如果查询不到数据,抛出异常DoesNotExist
filter() 参数查询条件,返回满足条件QuerySet集合数据
格式:[模型类属性名].object.filter([条件名]=[值]) 如:BookInfo.object.filter(id=1)
contains 查询包含某字符串的内容
例:BookInfo.objects.filter(btitle__contains='传')
isnull 空查询
例:BookInfo.objects.filter(btitle__isnull=False)
in() 范围查询
例:BookInfo.objects.filter(id__in=[1, 3, 5])
gt大于 lt小于 gte大于等于 lte小于等于 比较查询
例:BookInfo.objects.filter(id__gte=3)
bpub_date 日期查询
例:BookInfo.objects.filter(bpub_date__year=1980)
例:BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude 返回不满足条件的数据
例:BookInfo.objects.exclude(id=3)
F对象:用于类属性之间的比较
from django.db.models import F
# 查询阅读量大于评论量的信息 bread>bcpmment
BookInfo.objects.filter(bread__gr=F('bcomment'))
Q对象:用于查询时的逻辑条件,可以用&|~操作
from django.db.models import Q
# 查询id大于3或者阅读大于30的信息
BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))
order_by返回QuerySet,对查询结果进行排序
BookInfo.objects.all().order_by('-id')
聚合函数,对查询结果进行聚合操作sum count max min avg
aggregate:调用这个函数来使用聚合
from django.db.models import Sum, Count, Max, Min, Avg
BookInfo.objects.aggregate(Count('id'))
模型类关系
**答:**Django在中间件中预置了6个方法,着6个方法的去呗在于不同的阶段执行,对输入或输出进行干预。
示例:
class CommonMiddleware(object):
def process_request(self, request):
return None
def process_response(self, request, response):
return response
def __init__():
pass
def process_request(request):
pass
def process_view(request, view_func, view_args, view_kwargs):
pass
def process_template_response(request, response):
pass
def process_response(request, response):
pass
def process_exception(request, exception):
pass
答: uWSGI是一个web服务器,它实现了WSGI协议、uwsgi、http等协议。nginx中HttpUwsgiModele的作用是域uWSGI服务器进行交换。WSGI是一种web服务器网关接口,它是一个web服务器与web应用通信的一种规范。
WSGI、uwsgi、wWSGI的区别
WSGI是一种通信协议
uwgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信
uWSGI是实现了uwsgi和WSGI两种协议的web服务器
nginx是一个开源的高性能的HTTP服务器和反向代理;作为web服务器,它处理静态文件和索引文件效果非常好;塔的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间;稳定想高,配置简洁;强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用。
**答:**首先浏览器发起HTTP请求到nginx服务,nginx根据接收到的请求,进行url分析,判断访问的资源类型,如果是静态资源,直接读取静态资源返回给浏览器,如果请求的是动态资源就转交给uWSGI服务器,uWSGI服务器根据自身的uwsgi和WSGI协议,找到对应的django框架,django框架下的应用进行逻辑处理后,将返回值发送到uWSGI服务器,然后uWSGI服务器再返回给nginx,最后nginx将返回值返回给浏览器进行渲染显示给用户。
答:
**答:**将验证码保存到数据库或者session中,设置过期时间为1分钟,然后页面设置一个倒计时的展示,一分钟过后再次点击获取新的信息
答: django主要是用来搞快速开发的,他的两点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实现HTTP的通信,底层用纯C、C++写提升效率,ORM框架也去掉,自己编写封装与数据库交互的框架,因为ORM的效率真的很低。
**答:**提高性能往往指的是:并发数和响应时间
对于网站应能的优化一般包括:web前端性能优化,应用服务器性能优化,存储服务器优化。
关于前端的优化:
答: REST:representational state transfer的缩写,具象状态传输,一般解释为表现层状态转换
REST是设计风格而不是标准,是指客户端和服务器的交互形式,我们需要关注的重点是如何设计REST风格的网络接口。
特点:
答: 访问信任网站A,A会保存你的个人信息并返回给浏览器一个cookie,然后再cookie过期时间之内,访问了恶意网站B,B返回一些恶意请求代码,要求浏览器去访问A,浏览器再收到这个请求之后,就会直接带上保存到本地的cookie信息去访问网站A,然后网站A以为是用户本身的操作,导致来自恶意网站B的攻击代码被执行,导致个人信息隐私泄露和财产安全受到威胁。
解决办法:
跨域请求问题 django 怎么解决的
启用中间件;post 请求;验证码;表单中添加 csrf_token 标签
答: runserver方法是调试Django时经常用到的运行方式,它使用Django自带的WSGI Server运行,主要用于测试和开发中使用,并且runserver开启的方式也是单进程的
答: 在单元测试方面,django继承python的unittest.TestCase实现自己的django.test.TestCase,编写测试用例一般从这里开始,测试代码位于app中的tests.py文件中。
python manage.py test # 执行所有的测试用例
python manage.py test app_name # 执行该app的所有测试用例
python manage.py test app_name.case_name # 执行指定的测试用例
测试工具:unittest或pytest
答: 部署经验在阿里云服务器上部署的
技术:nginx+ uwsgi的方式来部署django项目
答: django中好事的任务用一个进程或线程来执行,比如邮件发送,使用celery
部署django项目的时候,配置文件中设置了金长城和线程的相关配置
答:
设置读取cookie
def cookie_set():
# 设置cookie
response = HttpResponse('设置cookie,请查看响应报文头
')
response.set_cookie('h1', 'hello django')
def cookie_get(request):
# 读取cookie
response = HttpResponse('读取cookie,数据如下:')
if response.COOKIES.has_key('h1'):
response.write(request.COOKIES['h1'])
以键值对的格式写会话:request.session['键'] = ‘值’
根据键读取值:request.session.get('键', 默认值)
清除所有会话,在存储中删除值部分:request.session.clear()
清除所有会话,在存储中删除会话的整条数据:request.session.flush()
删除会话中的指定键和值,在存储中只删除某个键及对应的值: del request.session['键']
设置会话的超时时间,如果没有指定过期时间则两个星期后过期:request.session.set_expiry(value)
value=0,则关闭浏览器的时候就过期;value=None,则永不过期
答:
优化算法时间
算法的时间复杂度对程序的执行效率影响最大,在python中可以通过选择合适的数据结构来优化时间复杂度,例如list和set查找某个元素的时间复杂度分别为O(n)和O(1),在不同场景由不同的优化方式。
循环优化
每种编程语言都强调需要优化循环。在python中,可以使用大量的技巧使得循环运行的更快。
尽量避免在循环中使用点操作,优化循环的关键就是减少python在循环内部执行的工作量。
函数选择
在循环的时候使用xrange而不是range,使用xrange可以节省大量的系统内存,因为xrange()在序列中每次调用只产生一个整数元素,而range则会直接返回完整的元素列表,用于循环时会不必要的开销。在python3中xrange不再存在,里面range提供一个可以遍历任意长度的方位的iterator
并行编程
因为GIL的存在,python很难充分利用多核CPU的优势,但是可以通过内置模块multiprocessing来实现一下集中并行模式:
多进程:对于CPU密集型的程序,可以使用multiprocessing中的Process,Pool等封装好的类,通过多进程的方式实现并行计算,。但是因为进程中通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有大的提高。
多线程:对于IO密集的程序,multiprocessing.dummy模块使用multiprocessing的接口封装threading,使得多线程编程也变得非常轻松
分布式:multiprocessing中的Managers类提供了可以在不同进程之间共享数据的方式,可以子啊此基础上开发分布式的程序。
使用性能分析工具
除了在ipython使用到的timeit模块,还有cProfile。cProfile的使用方法:python -m cProfile [文件名],可以在标准输出中看到每一个函数被滴哦用的次数及运行的时间,从而找到程序的性能瓶颈,可以有针对性的优化。
set的用法
set 的 union,intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的问题可以转换为 set 来操作。
PyPy
PyPy 是用 RPython(CPython 的子集)实现的 Python,根据官网的基准测试数据,它比 CPython 实现的 Python 要快 6 倍以上。快的原因是使用了 Just-in-Time(JIT)编译器,即动态编译器,与静态编译器(如 gcc,javac 等)不同,它是利用程序运行的过程的数据进行优化。由于历史原因,目前 pypy 中还保留着 GIL,不过正在进行的 STM 项目试图将 PyPy 变成没有 GIL 的 Python。如果 python 程序中含有 C 扩展(非 cffi 的方式),JIT 的优化效果会大打折扣,甚至比 CPython 慢(比 Numpy)。所以在 PyPy 中最好用纯 Python 或使用 cffi 扩展。
答: 情景:用户发起request,并等待response返回,在一些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发邮件、手机验证码等
使用 celery 后,情况就不一样了。解决:将耗时的程序放到 celery 中执行。
将多个耗时的任务添加到队列 queue 中,也就是用 redis 实现 broker 中间人,然后用多个 worker 去监听队列里的任务去执行。
任务 task:就是一个 Python 函数。
队列 queue:将需要执行的任务加入到队列中。
工人 worker:在一个新进程中,负责执行队列中的任务。
代理人 broker:负责调度,在布置环境中使用 redis。
答: Jieba分词支持三种分词模式:
精确模式:试图将句子最精确的切开,适合文本分析
全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词功能
分词,添加自定义词典,关键词提取,词性标注,并行分词,Tokenize:返回词语在原文的起始位置,ChineseAnalyzer for Whoosh 搜索引擎。
答: 一个动态网站的基本权衡点就是,它是动态的。每次用户请求页面,服务器就会重新计算,从开销处理的角度来看,这比读取一个线程的标准文件的代价要昂贵的多。
这就是需要缓存的地方。
Django自带了一个健壮的额缓存系统来保存动态页面,这样避免对于每次请求的重新计算。Django提供了不同级别的缓存力度:可以缓存特定视图的输出、可以仅仅缓存哪些很难生产出来的部分、或者可以缓存整个网站。Django也能很好的额配合“下游”缓存,比如Squid和基于浏览器的缓存。
设置缓存:
缓存系统需要一些设置才能使用。 也就是说,你必须告诉他你要把数据缓存在哪里- 是数据库中, 文件系统或者直接在内存中。它会影响你的缓存性能
你的缓存配置是通过 setting 文件的 CACHES 配置来实现的。这里有 CACHES 所有可配置的变量值。
答:
答: 如果用户在 A 应用服务器登陆的 session 数据没有共享到 B 应用服务器,那么之前的登录状态就没有了。
答: 使用HttpResponseRedirect,redirect和reverse
状态码:302, 301
runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的 WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。
uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具有超快的性能、低内存占用和多 app 管理等优点,并且搭配着 Nginx 就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势, 提升性能。
一般团购,秒杀,特价之类的活动,这样会使访问量激增,很多人抢购一个商品,作为活动商品, 库存肯定是很有限的。控制库存问题,数据库的事务功能是控制库存超卖的有效方式。
(1)在秒杀的情况下,肯定不能如此频率的去读写数据库,严重影响性能问题,必须使用缓存,将需要秒杀的商品放入缓存中,并使用锁来处理并发情况,先将商品数量增减(加锁、解析)后在进行其他方面的处理,处理失败再将数据递增(加锁、解析),否则表示交易成功。
(2)这个肯定不能直接操作数据库的,会挂的。直接读库写库对数据库压力太大了,要用到缓存。
(3)首先,多用户并发修改同一条记录时,肯定是后提交的用户将覆盖掉前者提交的结果了。这个直接可以使用加乐观锁的机制去解决高并发的问题。
使用场景:模板中的超链接,视图中的重定向
使用:在定义 url 时为 include 定义 namespace 属性,为 url 定义 name 属性在模板中使用 url 标签:{% url ‘namespace_value:name_value’%}
在视图中使用 reverse 函数:redirect(reverse('namespce_value:name_value’))根据正则表达式动态生成地址,减轻后期维护成本。
注意反向解析传参数,主要是在我们的反向解析的规则后面天界了两个参数,两个参数之间使用空格隔开:位置参数
配置好之后:
import logging
logger=logging.getLogger( name ) # 为 loggers 中定义的名称
logger.info("some info ...)
可用函数有:
logger.debug()
logger.info()
logger.warning()
logger.error()
答:
答: 前提:有外键存在时,可以很好的减少数据库请求的次数,提高性能
select_related通过多表join关联查询,一次性活得所有数据,只执行一次SQL查询
prefetch_related分别查询每个表,然后根据他们之间的关系进行处理,执行两次查询
# 1.使用execute执行自定义的SQL
from django.db import connection
cursor = connection.cursor()
cursor.excute('SQL语句')
# 2.使用extra方法
queryset.extra(select={'key': 'SQL语句'})
# 3. 使用raw方法:执行原始SQL并返回模型;依赖model多用于查询
objs = [models.Book(title='图书{}'.format(i+15)) for i in range(100)]
models.Book.objects.bulk_create(objs)
答:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fiels['city'].weight.choices = models.City.objects.all().values_list('id', 'name')
authors = form_model.ModelMultipleChoiceField(queryset=models.NewType.objects.all())
答: 删除关联表中的数据时,当前表与其关联的field的操作
on_delete=models.CASCADE # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING # 删除关联数据,什么也不做
on_delete=models.PROTECT # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET # 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
答:
Django的中间件是一个轻量级、底层的插件系统,可以接入django的请求和响应过程中,修改django的输入和输出。中间件的设计是为开发者提供了一种无侵入式的开发方式,增强了django框架的健壮性。
装饰器:主要是作用域问题。如果给视图函数上面添加装饰器,它能够保证这个视图的方法在执行之前或执行之后被执行。但是它仅仅适用于哪些视图添加装饰器,那些视图会有这些作用。
中间件:不会区分是哪个视图,所有的视图统统一视同仁,都会执行之前进行处理或请求之后进行处理。