Pythonpython全栈学习自学Python入门与进阶

django面试题(21道)

2018-09-04  本文已影响153人  SlashBoyMr_wang

1、什么是wsgi?

WSGI是Python在处理HTTP请求时,规定的一种处理方式。如一个HTTP Request过来了,那
么就有一个相应的处理函数来进行处理和返回结果。WSGI就是规定这个处理函数的参数长啥
样的,它的返回结果是长啥样的?至于该处理函数的名子和处理逻辑是啥样的,那无所谓。简单
而言,WSGI就是规定了处理函数的输入和输出格式。

2、django请求的生命周期?

3、列举django的内置组件?

4、列举django中间件的5个方法?以及django中间件的应用场景?

5、简述什么是FBV和CBV?

FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的优点:
- .提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
- .可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

6、django的request对象是在什么时候创建的?

class WSGIHandler(base.BaseHandler):
-------request = self.request_class(environ)
请求走到WSGIHandler类的时候,执行cell方法,将environ封装成了request

7、如何给CBV的程序添加装饰器?

        from django.utils.decorators import method_decorator
        1、给方法加:
            @method_decorator(check_login)
            def post(self, request):
                ...
        2、给dispatch加:
            @method_decorator(check_login)
            def dispatch(self, request, *args, **kwargs):
                ...
        3、给类加:
            @method_decorator(check_login, name="get")
            @method_decorator(check_login, name="post")
            class HomeView(View):
                ...

8、列举django orm 中所有的方法(QuerySet对象的所有方法)

  <1> all():                  查询所有结果 
  <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象。获取不到返回None
  <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个。
                              如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  <4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
  <5> order_by(*field):       对查询结果排序
  <6> reverse():              对查询结果反向排序 
  <8> count():                返回数据库中匹配查询(QuerySet)的对象数量。 
  <9> first():                返回第一条记录 
  <10> last():                返回最后一条记录 
  <11> exists():              如果QuerySet包含数据,就返回True,否则返回False
  <12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的
                              并不是一系 model的实例化对象,而是一个可迭代的字典序列
  <13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
  <14> distinct():            从返回结果中剔除重复纪录

9、select_related和prefetch_related的区别?

前提:有外键存在时,可以很好的减少数据库请求的次数,提高性能
select_related通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询
prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询

10、filter和exclude的区别?

两者取到的值都是QuerySet对象,filter选择满足条件的,exclude:排除满足条件的.

11、列举django orm中三种能写sql语句的方法

1.使用execute执行自定义的SQL
     直接执行SQL语句(类似于pymysql的用法)
        # 更高灵活度的方式执行原生SQL语句
        from django.db import connection
        cursor = connection.cursor()
        cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;")
        ret = cursor.fetchall()
        print(ret)
2.使用extra方法 :queryset.extra(select={"key": "原生的SQL语句"})
3.使用raw方法
    1.执行原始sql并返回模型
    2.依赖model多用于查询

12、values和values_list的区别?

13、cookie和session的区别:

14、如何使用django orm批量创建数据?

objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)]
models.Book.objects.bulk_create(objs)

15、django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新

def__init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")

16、django的Model中的ForeignKey字段中的on_delete参数有什么作用?

17、django的模板中自定义filter和simple_tag的区别?

    例子:自定义filter
            1. 在app01下创建一个叫templatetags的Python包
            2. 在templatetags的文件夹下创建py文件  myfilters
            3. 在py文件中写代码
                from django import template
                register = template.Library()
                
                @register.filter
                def add_sb(value,arg='aaa'):
                    return "{}_sb_{}".formart(value,arg)
                    
                @register.filter(name='sb')
                def add_sb(value,arg='aaa'):
                    return "{}_sb_{}".formart(value,arg)     
            4. 使用自定义filter
                {% load myfilters %}
                {{ name|add_sb:'xxx'}}
                {{ name|sb:'xxx'}}
例子:自定义simpletag
    创建
        1 、在app01中创建一个名字是templatetags的包,
        2、在包中创建一个py文件
        3、在py文件中导入
              from django import template
              register = template.Library()
        4、写函数
              @register.simple_tag(name="plus")
              def plus(a,b,c):
                  return '{}+{}+{}'.format(a,b,c)
        5、加装饰器@register.simple_tag(name="plus")
  使用
      1、导入
            {% load mytag %}
      2、使用
           {% plus 1 2 3 %}

18、django中csrf的实现机制

19、基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?

data: {
        csrfmiddlewaretoken: '{{ csrf_token }}'
  },
data: {
          csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
     },
headers:{ "X-CSRFtoken":$.cookie("csrftoken")}

20、Django本身提供了runserver,为什么不能用来部署?(runserver与uWSGI的区别)

21、Django如何实现websocket?

上一篇 下一篇

猜你喜欢

热点阅读