Django常见面试题总结(一)

article/2024/12/29 11:52:14

在这里插入图片描述

一、ORM是什么?优势?

ORM:中文翻译为对象关系映射
模型类名对应数据库表名
类属性对象数据库表字典
类属性中的字段对应数据库中的约束条件
模型类的多个实例对应于实例

优势:

orm的技术特点,提高了开发效率,可以自动将模型对象与数据库中的Table进行字段与属性的映射;
不用直接写SQL,能够像操作对象一样从数据库中获取数据

二、get请求和post请求的区别

1、GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
2、GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3、GET与POST请求在服务端获取请求数据方式不同。
4、GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

三、简述django请求的生命周期?(非常重要)

整个流程是一个线程在处理的,线程结束了,httprequest请求才结束的;并不是有响应结果了,代表请求就结束了;

中间件:例如请求进来的时候记录下日志,请求出去的时候记录下中间件;

在这里插入图片描述

1、用户请求进来先走到 wsgi
2、wsgi作为桥梁将请求交给 django框架,首先到中间件(请求之前做什么事情,请求之后做什么事情)
3、穿过django中间件(方法是process_request) 后进行路由匹配
4、路由匹配成功之后就进入相应的 :视图函数或者类视图中
5、在视图函数中可以调用orm做数据库操作
6、将数据库返回的数据经过drf框架做相应的处理,转换为json格式的数据
7、将json格式或者html文件都将会封装成一个响应httpresponse
8、再把这个响应结果经过所有中间件(先进后出)和wsgi 返回给用户

四、Django重定向你是如何实现的?用的什么状态码?

path('project/',views.ProjectView)
path('interface/',views.InterfaceView,name='kobe')def ProjectView(request):url=reverse('kobe')return HttpResponseRedirect('')def InterfaceView(request):return Response('')

五、django中csrf的实现机制?

Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:

1、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值

2、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性

3、当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御

六、cookie和session的区别:

客户端请求服务器,如果服务器需要记录用户状态,就使用response向客户端浏览器颁发一个Cookie,客户端保存起来。
当浏览器再次请求网站时,浏览器把请求信息连同Cookie一同提交到服务器,服务器检查Cookie,以此来辨认用户得状态
session是记录客户状态得机制,不同的是Cookie保存在客户端,session保存在服务端。客户端浏览器访问服务器的时候,服务器把客户端信息保存在服务器上。客户端再次访问时只需要从Session中查找客户得状态就可以了。

七、什么是wsgi?(非常重要)

全称 Python Web Server Gateway Interface指定了web服务器(nginx)和web框架之间的标准接口,以提高web应用在一系列web服务器间的移植性。

详细的说:

1、WSGI是一套接口标准协议/规范;
2、是作用在Web服务器和Python Web应用程序之间,用于通信;
3、目的是制定标准,以保证不同Web服务器可以和不同的Python框架之间相互通信

为什么需要wsgi呢?

当请求时Web服务器需要和web应用程序进行通信,但是web服务器有很多种啊,例如最新的是nginx,专门提供http服务的;Python web开发框架也对应多种啊,例如django、flask,专门开发web应用的;它们之间需要一个桥梁,所以WSGI应运而生,定义了一套通信标准试想一下,如果不统一标准的话,就会存在Web框架和Web服务器数据无法匹配的情况,那么开发就会受到限制,这显然不合理的。

为什么pycharm中能直接运行django、flask项目呢?

因为内置了http服务

在这里插入图片描述

八、什么是中间件并简述其作用? 列举django中间件的5个方法?以及django中间件的应用场景?

中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。

1、process_request(self,request) 先走request 通过路由匹配返回 ,例如做权限的验证,将权限的验证代码写到process_request(self,request) 中。验证不通过就不会执行视图函数了。
2、process_view(self, request, callback, callback_args, callback_kwargs) process_request(self,request) 函数之后,视图函数之前调用,再返回执行view ;
3、process_exception(self, request, exception) 这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。
4、process_response(self, request, response) 响应完毕,在传给客户端之前调用的方法;例如资源的回收,关闭日志文件

九、谈谈django的orm优化操作(非常重要)

1、尽可能的使用only与defer:Defer方法的用途是查询数据库时跳过指定的字段,only方法是指定需要载入的字段。从而节省空间。一行数据可能没啥关系,但数据很多时,节省的内存空间不可忽视。

2、select_related和prefetch_related都是做连表查询的:prefetch_related是查询了每个表,然后在语言层面进行连接,而select_related是通过join方法进行数据库的连接,所以select_related在查询的时候是比prefetch_related效率要高的,但是prefetch_related可以进行多对多的查询。
总结:可以理解为外键使用select_related,多对多使用prefetch_related。

3、在任何位置使用QuerySet.exists()或者QuerySet.count()都会导致额外的查询。

4、不要做无所谓的排序,排序并非没有代价,每个排序的字段都是数据库必须执行的操作。

5、如果要插入多条数据,则使用bulk_create来批量插入,减少sql执行的数量。

6、使用QuerySet.Iterator迭代大数据,要么使用分页。

7、复杂的查询(子查询),尽量采用原生SQL查询。

# 一、原生SQL ---> connection 
from django.db import connection, connections 
cursor = connection.cursor() # cursor = connections['default'].cursor() 
cursor.execute("""SELECT * from auth_user where id = %s""", [1]) 
row = cursor.fetchone() # fetchall()/fetchmany(..) # 二、extra 
def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None) # 构造额外的查询条件或者映射,如:子查询 Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) Entry.objects.extra(where=['headline=%s'], params=['Lennon']) Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, s elect_params=(1,), order_by=['-nid']) # 三、 raw函数 
def raw(self, raw_query, params=None, translations=None, using=None): # 执行原生SQL models.UserInfo.objects.raw('select * from userinfo') # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名 models.UserInfo.objects.raw('select id as nid,name as title from 其他表') # 为原生SQL设置参数 models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,]) # 将获取的到列名转换为指定列名 name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'} Person.objects.raw('SELECT * FROM some_other_table', translations=name_map) # 指定数据库 models.UserInfo.objects.raw('select * from userinfo', using="default")

十、django中如何实现orm表中添加数据时创建一条日志记录?(非常重要)

Django 中的一些常用内置信号。与Model 相关的信号,这些信号由各个 Model 的方法发送,如 save、__init__等,且通常都是成对出现的,如下所示:

1、django.db.models.signals.pre_init 与 django.db.models.signals.post_init:实例化模型之前与之后发送的信号,即在__init__方法执行的前后。
2、django.db.models.signals.pre_save与 django.db.models.signals.post_save:模型实例保存(执行save方法)前后发送的信号。
3、django.db.models.signals.pre_delete与 django.db.models.signals. post_delete:模型实例或 QuerySet 的 delete() 方法执行前后发送的信号。
4、django.db.models.signals.m2m_changed:模型实例中的ManyToManyField(多对多)字段被修改(add,remove,clear)的前后发送的信号。

十一 Django的MVT模式与MVC模式

MVT

M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。

V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应。

T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

MVT执行顺序

1,客户端发出请求,与关系型数据库进行交互
2,路由接收请求,根据请求地址查找视图
3,视图接收,处理 找到相应的Model(数据交互)
4, 与关系型数据库进行交互 取得数据
5,将取到的数据返回给Model
6,将数据交给view进行处理
7,将数据套入到需要的template,封装相对应的html,css,js编写的模板语言
8,将封装好的模板语言返回给view进行处理
9,客户端接受结果进行渲染html和css 执行js

在这里插入图片描述

MVC

M全拼为Model(模块),主要封装对数据库层的访问, 数据处理,对数据库中的数据进行增、删、改、查操作。

V全拼为View(视图),界面显示,用于封装结果,生成页面展示的html内容。

C全拼为Controller(控制器),逻辑处理,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。

在这里插入图片描述

MVC执行流程

1,客户端发出请求
2,controll,接收请求,进行业务处理 发送给Model
3, 与关系型数据库进行交互 取得数据
4,将取到的数据返回给Model
5,将数据交给controller.进行处理
6,将数据给view进行响应response封装
7,返回封装好response给controll
8,controll返回给客户端进行渲染HTML和css执行js

十二、django中怎么写原生SQL(非常重要)

使用extra:
queryset=NewsChannel.objects.filter(name__contains='美').extra(where=['id>4'])queryset=NewsChannel.objects.extra(where=["name='美女' OR name='体育'","url='/sport/'"])
使用raw
queryset=NewsChannel.objects.raw('select id from app3_news_channel where id>%s',params=[3])# 一、原生SQL ---> connection 
from django.db import connection
cursor = connection.cursor() 
cursor.execute("SELECT * from auth_user where id = %s", [1]) 
row = cursor.fetchone() # fetchall()/fetchmany(..)

十三、如何使用django orm批量创建数据(非常重要)

如果要插入多条数据,则使用bulk_create来批量插入,减少sql执行的数量。

postman上传excel文件

在这里插入图片描述

读取excel数据,并使用bulk_create批量插入数据

from openpyxl import load_workbook
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from app3.serializers import *class NewsChannelsAPIView(ModelViewSet):queryset = NewsChannel.objects.all()serializer_class = NewsChannelSerializer@action(methods=['POST'],detail=False)def create1(self,request):file_obj = request.FILES.get("file")cases = []  # 用来存储所有用例titles = []  # 保存标题excel_obj=load_workbook(file_obj) # 获取工作簿对象ws = excel_obj.worksheets[0]print(ws.rows)for i ,row in enumerate(ws.rows):if i == 0:for cell in row:titles.append(cell.value)else:cases.append(dict(zip(titles, [cell.value for cell in row])))querysetList=[]for i in cases:querysetList.append(NewsChannel(id=i['id'],name=i['name'],url=i['url']))NewsChannel.objects.bulk_create(querysetList)print(querysetList)data={'msg':'success'}return Response(data)

十四、Django中当用户登录到A服务器进入登陆状态,下次被nginx代理到B服务器会出现什么影响

如果用户在A应用服务器登陆的session数据没有共享到B应用服务器,那么之前的登录状态就没有了。

十五、跨域请求Django是如何处理的(非常重要)

什么是同源?

url由协议、域名、端⼝和路径组成;如果两个url的协议、域名和端⼝相同,则这两个url是同源的。

同源目的?

同源政策的⽬的,是为了保证⽤户信息的安全,防⽌恶意的⽹站窃取数据。

例如:

前端和后端分别是两个不同的端⼝
前端:127.0.0.1:8081
后端:192.168.17.129:8880

现在,前端与后端分别是不同的端⼝,不同的ip,这就涉及到跨域访问数据的问题,因为浏览器的同源策略,默认是不⽀持两个不同域名间相互访问数据,⽽我们需要在两个域名间相互传递数据,这时我们就要为后端添加跨域访问的⽀持。

步骤:

1 安装 : pip install django-cors-headers
2 注册子应用 ```corsheaders
INSTALLED_APPS = [

‘corsheaders’,

]
3 中间件配置
MIDDLEWARE = [
‘corsheaders.middleware.CorsMiddleware’,

]
4 添加⽩名单

CORS_ORIGIN_WHITELIST = ( 'http://127.0.0.1:8081','http://127.0.0.1:8080', 'http://localhost:8080', 'http://www.nagle.cn:8080', 'http://api.nagle.cn:8083',
)
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie

凡是出现在⽩名单中的域名,都可以访问后端接⼝CORS_ALLOW_CREDENTIALS 指明在跨域访问中,后端是否⽀持对cookie的操作。

十六、urlpatterns中的name与namespace有什么作用?你是如何使用的?

在这里插入图片描述

十七、如何设置一个带有枚举值的字典?

class NewsChannel(models.Model):GENDER_CHOICE=[(1,'体育频道'),(2,'音乐频道'),(3,'科技频道')]'''新闻频道'''id=models.AutoField(primary_key=True)name=models.CharField(max_length=30,unique=True,verbose_name='频道名称')url=models.CharField(default='',null=True,blank=True,max_length=50,verbose_name='频道页面链接')status=models.SmallIntegerField(max_length=5,choices=GENDER_CHOICE,default=1)class Meta:db_table='app3_news_channel'verbose_name='新闻频道'verbose_name_plural=verbose_name

十八、DateTimeField类型中的auto_now与auto_now_add有什么区别

auto_now:用于更新时间;这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。
如果使用django再带的admin管理器,那么该字段在admin中是只读的。

auto_now_add:用于创建时间,这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。
auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。

十九、class Meta中的元信息字段有哪些

在这里插入图片描述

二十、Django 本身提供了 runserver,为什么不能用来部署?

runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的  WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/nCkObaSW.shtml

相关文章

Django面试题

目录 1 列举Http请求中常见的请求方式 2 谈谈你对HTTP协议的认识 3 简述MVC模式和MVT模式 4 简述Django请求生命周期 5 简述什么是FBV和CBV 6 谈一谈你对ORM的理解 7 rest_framework 认证组件的流程 8 什么是中间件并简述其作用 9 django 中间件生命周期 10 django中…

2020年最新Django经典面试问题与答案汇总(上)-大江狗整理

周末抽空整理了下Django经典面试问题及答案,希望对小伙伴们学习和工作有所帮助。如果小编我是负责招聘Python Web或Django开发人员的面试官,我也会考虑问如下问题。从下面可以大致了解一个面试者对Django技术的了解程度。由于篇幅所限,本文将…

用HTML5制作的3D相册

HTML5 非常强大,尤其是和CSS3结合,有时候能达到非同凡响的网页动画效果。今天要分享的这款HTML5应用就是一款很酷的3D立体图片相册应用,它可以用鼠标多拽从多个角度浏览相册图片,点击图片,就可以放大图片,…

HTML5制作信息登记表

# 制作信息登记表#样式需求分析: 一、 通过最外层的大盒子对页面进行整体控制,设置宽高、背景图片及相对定位。 二、 通过标记对表单进行整体控制,对其设置宽高、边距、边框样式及绝对定位。 三、 通过 标记控制标题的文本样式,对其设置…

HTML5制作二级菜单(主菜单的子菜单)

HTML5制作二级菜单&#xff08;主菜单的子菜单&#xff09; 一、HTML文件代码二、 CSS文件代码三、效果图 一、HTML文件代码 <!--submenu.html--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><link r…

制作HTML5海报

一、HTML5海报有什么卵用&#xff1f; HTML5海报作用跟一般的海报差不多&#xff0c;但是拥有更生动的灵活的页面和便捷快速的传播途径&#xff08;网络&#xff09;。不仅可以在微信公众号中推广&#xff0c;也可以在票圈&#xff0c;空间&#xff0c;群上推广。做得好的海报&…

用html5和css制作信息登记表

<!doctype html> <html><head><meta charset"utf-8"><title>信息登记表</title><!-- <link rel"stylesheet" href"style07.css" type"text/css"> --><style type"text/css&q…

html5制作购物车页面,利用html来制作一个简单美观的购物车界面

首先来展示一下购物车界面: (学习视频分享:html视频教程) 这个页面只是实现了其布局视图,没有使用js或者jquery相关语言,在博主看来是比较利于我们将其加入到自己的程序中的以下是相关代码: index.html 商品名称单价数量操作旁氏洗发露991删除旁氏洗发露991<

html5制作圆形

代码如下 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Document</title> <style type"text/css"> .addBg { width: 100px; height: 100px; background-color…

html页面转盘如何实现,html5制作转盘的详解及实例

今天给大家带来的案列是html5转盘实例,可以直接拿来做抽奖程序,有需要的朋友可以拿去使用,下面是案列代码。html5制作转盘游戏 h1{width: 100%; height: 3rem; line-height: 3rem; font-size: 1.8rem; color:#c60; text-align: center; font-weight: bolder; } KinerLotter—…

用html做网页作品,HTML5实例:用HTML5制作的网页的15个优秀案例

在这里分享给大家精心挑选的15个HTML5网站模板&#xff0c;这些模板涉及商业、投资、简历、画廊、艺术、慈善、房地产&#xff0c;以及食品等等方面。 1. Zeni – Responsive HTML5 Portfolio Template Demo Download 2. Torn – HTML5 Template 5 Skins Demo Download 3. Fold…

用HTML5制作一个简易计算器

用H5制作一个简易计算器 最近刚学JavaScript&#xff0c;之后紧接着做了一个简易的计算器&#xff0c;能够实现数字的加减乘除运算。 首先&#xff0c;先用HTML5搭建好计算器大体框架。我这里用了两个表格&#xff0c;一个充当显示器&#xff0c;另一个表格就做成计算器按键部…

如何用html做一个贪吃蛇,如何用HTML5制作贪吃蛇游戏

如何用HTML5制作贪吃蛇游戏 发布时间:2020-07-09 15:09:59 来源:亿速云 阅读:122 作者:Leah 如何用HTML5制作贪吃蛇游戏?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 本文介绍了H5 c…

用HTML5制作精美战机游戏

每天要被大学老师催H5作业&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 不如看看本文&#xff0c;代码齐全&#xff0c;直接用来做参考案例&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; 代码…

用HTML5制作课程表

无论是上班族还是学生党&#xff0c;都需要一份类似课程表的表格来提醒我们的日程。有了它就可以不必担心自己忘记该干什么事情&#xff0c;到点了该干什么事情。它可以说是我们日常生活中经常接触的事物了&#xff0c;制作一份课程表也很简单&#xff0c;可以用纸写&#xff0…

使用HTML5制作的网页游戏-管道小鸟(附源码)

目录 1.整体项目框架 2.css样式 3. 游戏初始化 4.游戏结束提示 5.效果图​ 1.整体项目框架 2.css样式 *{padding: 0px;margin: 0px;}#game{width: 800px;height: 600px;background-image: url(img/bg.png);position: relative;overflow: hidden;/*溢出隐藏*/}#bird{width…

html做的小游戏,41个用HTML5制作完成的游戏作品

了解的人都应该知道HTML5有大量的动画和交互功能&#xff0c;完全可以用来完成一些游戏类的操作&#xff0c;今天收集分享&#xff1a;41个用HTML5制作完成的游戏作品&#xff0c;希望其中有你喜欢和需要的&#xff0c;或者可以给你带来灵感的。 1-Pirateslovedaisies 2-Torus …

John Petrucci-Wild Stringdom(1)

John Petrucci-Wild Stringdom(1) 第一章 练习导致完美 最能打击一个吉他手的事情&#xff0c;莫过于不能很快地达到自认为理所当然的水平而带来的焦虑。如果你经常在弹了数小时以后依然发现自己一无所获。那么这章就是专门为你写的。这章主要是概括了该如何练习的要点。当你开…

知识的迷宫 网络上的时间是如何度过的

作者&#xff1a;马伯庸 字数&#xff1a;1287 我在写一篇专栏文章&#xff0c;需要查阅一下关于宣武门的资料。   现在查资料比从前方便多了&#xff0c;只消在网上检索一下&#xff0c;立刻得到海量信息。于是很快我就得到了想要的资料&#xff0c;准备动笔写了。  …

蓝色默认蓝色色值_美丽的蓝色网站展示

每次您访问一个从未见过的网站时&#xff0c;第一印象是什么&#xff1f; 这是配色方案&#xff01; 颜色对任何用户而言都是最重要的。 颜色是影响个人感知的第一件事 &#xff0c;它以微妙的方式传达信息。 无论内容的质量如何&#xff0c;或网站的可用性如何&#xff0c;至…