面试题—Django框架部分
Django框架面试题
1.基础部分
1.Django的生命周期是怎样的过程?
解析:
客户端发送请求,经由django的wsgi模块,调用socket创建服务端并发接受客户端的请求,请求经过正向依次经过中间件中的process_reqeust方法处理。
处理完后,经过Django中的url分发,调用对应的视图函数,视图函数根据具体的请求业务逻辑,通过orm模型操作数据库获取数据,在通过模板系统渲染html文件,最后返回一个HttpResponse对象。
HttpResponse对象反向依次经过中间件中的process_response方法处理,最终经由wsgi的socket服务端返回给客户端。
2.写出你所知道Djang有关的所有命令(下载、安装等)
1.安装django pip install django == 1.11.15 2.创建项目 diangoadmin startproject 项目名 3.启动项目 cd 项目目录 python manage.py runserver #127.0.0.1:8000 python manage.py runserver 80 python manage.py runserver 0.0.0.0:80 4.创建App python manage.py startapp app01 5.数据库迁移 python manage.py makemigrations #检查 models.py是否有变化,记录变化 app01/migrations python manage.py migrate #将变更记录同步到数据库中
3.Django的setting.py中,你用到的配置项有哪些?他们的作用是什么?
1.INSTALLED_APPS # 注册App 让Django 程序可以识别新建的App 2.MIDDLEWARE # 中间件 自定义中间件注册进来可以执行其中的方法 3.TEMPLATES # 模版的相关配置 主要看DIRS 模版的存放路径 4.DATABASES # 数据库相关配置 告诉Django连接什么数据库 5.STATIC_URL='/static/' # 静态文件的别名, 模版中已别名开头 6.STATICFILES_DIRS = [ #静态文件的具体存放路径,Django会按照该路径去找静态文件。 os.path.join(BASE_DIR,'static') ]
4.Django使用Mysql数据库的流程是什么?
1.创建一个mysql数据库 2.settings 中写配置 DATABASES={ 'defalut':{ 'ENGINE':'django.db.backends.mysql', "NAME":'library', "USER":'root', "HOST":'127.0.0.1', "PORT":3306, } }
3.告诉django使用pymysql的模块连接mysql数据库 在与settings 同级的目录下的 __init__.py中写代码: import pymysql pymysql.install_as_MySQLdb()
4.在app01/models.py中写类(继承models.Model) class Publisher(models.Model): id = models.AutoField(primary_key = True) name = models.CharField(max_length = 32,unique = True)
5.数据库迁移的命令 python manage.py makemigrations python ,manage.py migrate
5.ORM是什么?为什么要使用ORM?他的优缺点是什么?他的对应关系是什么?
1.ORM(对象关系映射) 是一种为了解决面向对象与关系型数据库不匹配的技术
2.使用ORM不用在过多得关注SQL语句的编写,而是更加专注于逻辑代码的编写
3.优点:
- ORM 提供了对数据库的映射,不用直接编写SQL代码, 只需操作对象就能对数据库操作数据
- 让软件开发人员专注于业务逻辑的处理,提高了开发效率
缺点:
- ORM 的缺点是会在一定程度上牺牲程序的执行效率
- ORM 的操作是有限的, 也就是ORM定义好的操作是可以完成的
4.对应关系
- 类 ----> 数据表
- 对象-----> 数据行
- 属性 -----> 字段
6.CBV使用装饰器的方法有哪些,分别是什么?写出简单示例.
1.导入方法装饰器 from django.utils.decorators import method_decorator 2.方法: # 1.给方法上加装饰器 @method_decorator(wraper) def get(self,request,*args,**kwargs) return HttpResponse("ok") # 2.给dispatch 上加 @method_decorator(wraper) def dispatch(self,request,*args,**kwargs): # 3.给类上加 @method_decorator(wraper,name = 'get') class Simple(View)
7.cookie 和session 是什么? 为什么要使用它们?
1.cookie 定义: cookie是服务器让浏览器保存在浏览器本地的键值对 原因: http 是无状态,每次请求之间没有任何关系,无法保存状态. 使用cookie 来保存 一些状态 2.session 定义: session 是保存在服务器上的键值对,依赖于cookie 原因: cookie 在浏览器端 不太安全 cookie 长度受限 session长度不受限
8.Django的中间件是什么?请写出 process_request 和process_response 以及process_view三个方法的执行时间、执行顺序和不同返回值不同的流程
1.process_request(self.request) 执行时间 :请求来 先执行,在视图之前 执行顺序: 按照注册顺序执行 返回值: 返回值是None 正常往后走 返回值是 HttpResponse 对象 后面的不在走, 直接执行当前中间的 process_response方法 2.process_response(self,request,response) 执行时间: 视图函数之后 执行顺序:安装注册顺序倒序执行 返回值: HttpResponse对象 3.process_view(self,request,view_func,view_args,view_kwargs) 执行时间: 在视图之前 ,process_request之后 执行顺序: 按照注册顺序 顺序执行 返回值: None 正常往后走 HttpResponse 对象 后面的中间件 process_view方法、视图不执行 走所有中间的 process_response方法
9.请写出自定义filter的步骤
1.在app下创建一个名叫 templatetags 的python包 templatetags不能写错 2.在templatetags 里建一个 py文件 myfilters 3.在py文件中编辑: from django import template register = template.Library() # register 名字不能错 @register.filter def add_sb(value,arg): return '{}sb'.format(value) @register.filter(name = 'dsd') def add_sb(value,arg): return '{}sb'.format(value) 4.重启 5.使用filter {% load myfilters %} {{ name1|dsd:'very' }}
10.Django中操作 cookie 和session 的方法有哪些?
1.cookie 1.设置 cookie rep = redirect("/index/") rep.set_cookie(key,value,max_age = 1000) rep.set_signed_cookie(key,value,max_age = 1000, salt = '') 2.获取 cookie request.COOKIES['key'] request.COOKIES.get('key') --->推荐的取法 request.get_signed_cookie('key',salt ='') 3.删除 cookie rep.delete_cookie('key') 2.session 1.设置session request.session['key'] = value request.session.setdefault(key,value) ---->存在就不设置 2.获取session request.session['key'] request.session.get(key,'') 3.删除 session request.session.pop(key) ----->删除某一个键值对 del request.session['key'] request.session.delete() -->删除所有的session 键值对 request.session.flush() -->删除所有的session 键值对,删除了 cookie 4.设置超时时间 request.session.set expiry() 5.清除当前过期的 session request.session.clear_expired()
衣带渐宽终不悔,为伊消得人憔悴!