2024年最全【2024】Python面试题【web框架】_foreignkey的必选参数on(1)

这里写图片描述
console.log(‘老男孩’)

21、看图写结果:

这里写图片描述
结果什么也没有 因为console.log.的时候xo还没有定义

22、看图写结果:

这里写图片描述
alert(”武沛齐’)

23、看图写结果:

这里写图片描述
alert(”武沛齐’)

24、django、flask、tornado框架的比较?

Django:Python 界最全能的 web 开发框架,battery-include 各种功能完备,可维护性和开发速度一级棒。常有人说 Django 慢,其实主要慢在 Django ORM 与数据库的交互上,所以是否选用 Django,取决于项目对数据库交互的要求以及各种优化。而对于 Django 的同步特性导致吞吐量小的问题,其实可以通过 Celery 等解决,倒不是一个根本问题。Django 的项目代表:Instagram,Guardian。

Tornado:天生异步,性能强悍是 Tornado 的名片,然而 Tornado 相比 Django 是较为原始的框架,诸多内容需要自己去处理。当然,随着项目越来越大,框架能够提供的功能占比越来越小,更多的内容需要团队自己去实现,而大项目往往需要性能的保证,这时候 Tornado 就是比较好的选择。Tornado项目代表:知乎。

Flask:微框架的典范,号称 Python 代码写得最好的项目之一。Flask 的灵活性,也是双刃剑:能用好 Flask 的,可以做成 Pinterest,用不好就是灾难(显然对任何框架都是这样)。Flask 虽然是微框架,但是也可以做成规模化的 Flask。加上 Flask 可以自由选择自己的数据库交互组件(通常是 Flask-SQLAlchemy),而且加上 celery +redis 等异步特性以后,Flask 的性能相对 Tornado 也不逞多让,也许Flask 的灵活性可能是某些团队更需要的。

25、什么是wsgi?
  1. WSGI(Web Server Gateway Interface,Web 服务器网关接口)则是Python语言中1所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。
  2. WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化。WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。
  3. Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。
26、django请求的生命周期?

前端请求—>nginx—>uwsgi.—>中间件—>url路由—->view试图—>orm—->拿到数据返回给view—->试图将数据渲染到模版中拿到字符串—->中间件—>uwsgi—->nginx—->前端渲染

27、列举django的内置组件?

url 、view、model、template、中间件

28、列举django中间件的5个方法?以及django中间件的应用场景?
  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_exception(self, request, exception)
  • process_response(self, request, response)
29、简述什么是FBV和CBV?

django中请求处理方式有2种:FBV 和 CBV
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views)就是在视图里使用类处理请求 类需要继承view

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

当请求一个页面时,Django会建立一个包含请求元数据的 HttpRequest 对象。 当Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。每个视图会返回一个HttpResponse 对象。

31、如何给CBV的程序添加装饰器?
  from django.views import View
  from django.utils.decorators import method_decorator

  def auth(func):
      def inner(\*args,\*\*kwargs):
          return func(*args,**kwargs)
      return inner

  class UserView(View):                       
      @method\_decorator(auth)
      def get(self,request,\*args,\*\*kwargs):
          return HttpResponse('...')
32、列举django orm 中所有的方法(QuerySet对象的所有方法)

返回Query Set对象的方法有:
* all()
* filter()
* exclude()
* order_by()
* reverse()
* dictinct()

特殊的QuerySet:
* values() 返回一个可迭代的字典序列
* values_list() 返回一个可迭代的元祖序列

返回具体对象的:
* get()
* first()
* last()

返回布尔值的方法有:
* existe()

返回数学的方法有:
* count( )

33、only和defer的区别?
  • defer : 映射中排除某列数据
  • only : 仅取某个列中的数据
34、select_related和prefetch_related的区别?
  • select_related通过多表join关联查询,一次性获得所有数据,通过降低数据库查询次数来提升性能,但关联表不能太多,因为join操作本来就比较消耗性能
  • prefetch_related()的解决方法是,分别查询每个表,然后用Python处理他们之间的关系!
    都是为了减少SQL查询的数量
35、filter和exclude的区别?

filter是查询满足条件的数据
exclude是查询不满足添加的数据

36、列举django orm中三种能写sql语句的方法。
# 1.使用execute执行自定义SQL
  # 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()

# 2.使用extra方法 

  # 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"}, select\_params=(1,), order\_by=['-nid'])

# 3.使用raw方法
#   解释:执行原始sql并返回模型
#   说明:依赖model多用于查询
#   用法:
#     book = Book.objects.raw("select \* from hello\_book")
#     for item in book:
#       print(item.title)
37、django orm 中如何设置读写分离?
 class Router1:
      def allow\_migrate(self, db, app\_label, model\_name=None, \*\*hints):
          """
 All non-auth models end up in this pool.
 """
          if db=='db1' and app_label == 'app02':
              return True
          elif db == 'default' and app_label == 'app01':
              return True
          else:
              return False

          # 如果返回None,那么表示交给后续的router,如果后续没有router,则相当于返回True

      def db\_for\_read(self, model, \*\*hints):
          """
 Attempts to read auth models go to auth\_db.
 """
          if model._meta.app_label == 'app01':
              return 'default'
          else:
              return 'db1'

      def db\_for\_write(self, model, \*\*hints):
          """
 Attempts to write auth models go to auth\_db.
 """
          if model._meta.app_label == 'app01':
              return 'default'
          else:
              return 'db1'

38、F和Q的作用?

F:操作数据表中的某列值,F( )允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操作,直接执行原生产sql语句操作。

通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交

Q:对对象进行复杂查询,并支持&(and),|(or),~(not)操作符。

39、values和values_list的区别?
  • values方法可以获取number字段的字典列表。
  • values_list可以获取number的元组列表。
  • values_list方法加个参数flat=True可以获取number的值列表。
40、如何使用django orm批量创建数据?
  def bulk\_create(self, objs, batch\_size=None):
        # 批量插入
        # batch\_size表示一次插入的个数
        objs = [
            models.DDD(name='r11'),
            models.DDD(name='r22')
        ]
        models.DDD.objects.bulk_create(objs, 10)
41、django的Form和ModeForm的作用?
- 作用:
      - 对用户请求数据格式进行校验
      - 自动生成HTML标签
  - 区别:
      - Form,字段需要自己手写。
          class Form(Form):
              xx = fields.CharField(.)
              xx = fields.CharField(.)
              xx = fields.CharField(.)
              xx = fields.CharField(.)
      - ModelForm,可以通过Meta进行定义
          class MForm(ModelForm):
              class Meta:
                  fields = "__all__"
                  model = UserInfo                            
  - 应用:只要是客户端向服务端发送表单数据时,都可以进行使用,如:用户登录注册
42、django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
方式一:重写构造方法,在构造方法中重新去数据库获取值
  class UserForm(Form):
      name = fields.CharField(label='用户名',max_length=32)
      email = fields.EmailField(label='邮箱')
      ut_id = fields.ChoiceField(
          # choices=[(1,'二B用户'),(2,'山炮用户')]
          choices=[]
      )

      def \_\_init\_\_(self,\*args,\*\*kwargs):
          super(UserForm,self).__init__(*args,**kwargs)

          self.fields['ut\_id'].choices = models.UserType.objects.all().values_list('id','title')
  方式二: ModelChoiceField字段
  from django.forms import Form
  from django.forms import fields
  from django.forms.models import ModelChoiceField
  class UserForm(Form):
      name = fields.CharField(label='用户名',max_length=32)
      email = fields.EmailField(label='邮箱')
      ut_id = ModelChoiceField(queryset=models.UserType.objects.all())    

  依赖:
      class UserType(models.Model):
          title = models.CharField(max_length=32)

          def \_\_str\_\_(self):
              return self.title
43、django的Model中的ForeignKey字段中的on_delete参数有什么作用?

on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值

CASCADE:此值设置,是级联删除。

PROTECT:此值设置,是会报完整性错误。

SET_NULL:此值设置,会把外键设置为null,前提是允许为null。

SET_DEFAULT:此值设置,会把设置为外键的默认值。

SET():此值设置,会调用外面的值,可以是一个函数。

44、django中csrf的实现机制?

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

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

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

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

具体配置如下:

template中添加{%csrf_token%}标签

45、django如何实现websocket?

利用dwebsocket在Django中使用Websocket
https://www.cnblogs.com/huguodong/p/6611602.html

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

https://www.cnblogs.com/wxp5257/p/7834090.html

47、django中如何实现orm表中添加数据时创建一条日志记录。
在settings.py中添加:
LOGGING = {
    'disable\_existing\_loggers': False,
    'version': 1,
    'handlers': {
        'console': {
            # logging handler that outputs log messages to terminal
            'class': 'logging.StreamHandler',
            'level': 'DEBUG', # message level to be written to console
        },
    },
    'loggers': {
        '': {
            # this sets root level logger to log debug and higher level
            # logs to console. All other loggers inherit settings from
            # root level logger.
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False, # this tells logger to send logging message
                                # to its parent (will send if set to True)
        },
        'django.db': {
            # # django also has database level logging
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}
48、django缓存如何设置?
  三种粒度缓存
   1 中间件级别
       'django.middleware.cache.UpdateCacheMiddleware',
       'django.middleware.cache.FetchFromCacheMiddleware',
        CACHE_MIDDLEWARE_SECONDS=10

   2 视图级别

      from django.views.decorators.cache import cache_page
      @cache_page(15)
      def index(request):
          import time
          t=time.time()
          return render(request,"index.html",locals())


   3 局部缓存
      {% load cache %}
          ...
          ...
      {% cache 15 "time\_cache" %}
      <h3>缓存时间:{{ t }}</h3>
      {% endcache %}
49、django的缓存能使用redis吗?如果可以的话,如何配置?
  pip install django-redis  
  apt-get install redis-server

  然后在settings.py 里面添加CACHES = {
  'default': {
  'BACKEND': 'redis\_cache.cache.RedisCache',
  'LOCATION': '127.0.0.1:6379',
  "OPTIONS": {
  "CLIENT\_CLASS": "redis\_cache.client.DefaultClient",
  },
  }
50、django路由系统中name的作用?

name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个小名”,只要这个名字不变,网址变了也能通过名字获取到。

51、django的模板中filter和simple_tag的区别?

simple_tag
  -参数任意,但是不能作为if条件判断的条件
filter
  -参数最多只能有两个,但是可以作为if条件判断的条件。

52、django-debug-toolbar的作用?

django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。
包括查看执行的sql语句,db查询次数,request,headers,调试概览等。
https://blog.youkuaiyun.com/weixin_39198406/article/details/78821677

53、django中如何实现单元测试?

https://www.jianshu.com/p/34267dd79ad6

54、解释orm中 db first 和 code first的含义?

datebase first就是代表数据库优先,那么前提就是先创建数据库。
model first就是代表model优先,那么前提也就是先创建model,然后根据model自动建立数据库。

55、django中如何根据数据库表生成model中的类?

Django附带一个名为inspectdb的实用程序,可以通过检查现有的数据库来创建Model(模型)

56、使用orm和原生sql的优缺点?

ORM框架:

对象关系映射,通过创建一个类,这个类与数据库的表相对应!类的对象代指数据库中的一行数据。

简述ORM原理:

让用户不再写SQL语句,而是通过类以及对象的方式,和其内部提供的方法,进行数据库操作!把用户输入的类或对象转换成SQL语句,转换之后通过pymysql执行完成数据库的操作。

ORM的优缺点:

优点:
* 提高开发效率,降低开发成本
* 使开发更加对象化
* 可移植
* 可以很方便地引入数据缓存之类的附加功能

缺点:
* 在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。就需要写入原生SQL。

57、简述MVC和MTV

MTV和MVC?

MVC: 模型 视图 控制器
MTV: 模型 模板 视图

58、django的contenttype组件的作用?

django内置的ContentType组件就是帮我们做连表操作
如果一个表与其他表有多个外键关系,我们可以通过ContentType来解决这种关联
http://www.cnblogs.com/iyouyue/p/8810464.html

59. 谈谈你对restfull 规范的认识?
  • restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。

    • 最显著的特点:
      restful: 给用户一个url,根据method不同在后端做不同的处理,比如:post 创建数据、get获取数据、put和patch修改数据、delete删除数据。
      no rest: 给调用者很多url,每个url代表一个功能,比如:add_user/delte_user/edit_user/

    • 当然,还有协议其他的,比如:

      • 版本,来控制让程序有多个版本共存的情况,版本可以放在 url、请求头(accept/自定义)、GET参数
      • 状态码,200/300/400/500
      • url中尽量使用名词,restful也可以称为“面向资源编程”
      • api标示:
        api.YueNet.com
        www.YueNet.com/api/
60、接口的幂等性是什么意思?

一个接口通过首先进行1次访问,然后对该接口进行N次相同访问的时候,对访问对象不造成影响,那么就认为接口具有幂等性。
比如:
* GET, 第一次获取数据、第二次也是获取结果,幂等。
* POST, 第一次新增数据,第二次也会再次新增,非幂等。
* PUT, 第一次更新数据,第二次不会再次更新,幂等。
* PATCH,第一次更新数据,第二次可能再次更新,非幂等。
* DELTE,第一次删除数据,第二次不会再次删除,幂等。

61、什么是RPC?

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

62. Http和Https的区别?

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

63、为什么要使用django rest framework框架?

1.客户端-服务端分离
优点:提高用户界面的便携性,通过简化服务器提高可伸缩性….
2.无状态(Stateless):从客户端的每个请求要包含服务器所需要的所有信息
优点:提高可见性(可以单独考虑每个请求),提高了可靠性(更容易从局部故障中修复),提高可扩展性(降低了服务器资源使用)
3.缓存(Cachable):服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求
优点:减少交互次数,减少交互的平均延迟
4.统一接口
优点:提高交互的可见性,鼓励单独改善组件
5.支持按需代码(Code-On-Demand 可选)
优点:提高可扩展性

64、django rest framework框架中都有那些组件?
- 路由,自动帮助开发者快速为一个视图创建4个url
            www.oldboyedu.com/api/v1/student/$
            www.oldboyedu.com/api/v1/student(?P<format>\w+)$    
            www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$
            www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$

    - 版本处理
        - 问题:版本都可以放在那里?
                - url
                - GET 
                - 请求头 
    - 认证 
        - 问题:认证流程?

    - 权限 
        - 权限是否可以放在中间件中?以及为什么?

    - 访问频率的控制
        - 匿名用户可以真正的防止?无法做到真正的访问频率控制,只能把小白拒之门外。
          如果要封IP,使用防火墙来做。

        - 登录用户可以通过用户名作为唯一标示进行控制,如果有人注册很多账号,也无法防止。

    - 视图

    - 解析器 ,根据Content-Type请求头对请求体中的数据格式进行处理。request.data 

    - 分页

    - 序列化
        - 序列化
            - source
            - 定义方法
        - 请求数据格式校验

    - 渲染器
65、django rest framework框架中的视图都可以继承哪些类?

a. 继承 APIView

  这个类属于rest framework中顶层类,内部帮助我们实现了只是基本功能:认证、权限、频率控制,但凡是数据库、分页等操作都需要手动去完成,比较原始。


 class GenericAPIView(APIView)

      def post(...):
          pass 

b. 继承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)

如果继承它之后,路由中的as_view需要填写对应关系 .as_view({‘get’:’list’,’post’:’create’})
在内部也帮助我们提供了一些方便的方法:

  • get_queryset
  • get_object
  • get_serializer
  注意:要设置queryset字段,否则会跑出断言的异常。
  # 只提供增加功能
  class TestView(GenericViewSet):
      serializer_class = XXXXXXX

      def create(self,*args,**kwargs):
          pass # 获取数据并对数据进行操作

c. 继承

  • ModelViewSet
  • mixins.CreateModelMixin,GenericViewSet
  • mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
  对数据库和分页等操作不用我们在编写,只需要继承相关类即可。

  示例:只提供增加功能
  class TestView(mixins.CreateModelMixin,GenericViewSet):
      serializer_class = XXXXXXX

66、简述 django rest framework框架的认证流程。
  • 如何编写?写类并实现authticate

  • 方法中可以定义三种返回值:

    • (user,auth),认证成功
    • None , 匿名用户
    • 异常 ,认证失败
  • 流程:

    • dispatch
    • 再去request中进行认证处理
67、django rest framework如何实现的用户访问频率控制?

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值