zoukankan      html  css  js  c++  java
  • 我的面试笔记

    一、WEB框架

    1. 请简述django请求生命周期

    • 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
    • 服务端的wsgiref模块接收用户请求并将请求进行初次封装
    • 将请求交给Django的中间件
    • 通过中间件之后将请求交给url,根据浏览器发送的不同url去匹配不同的视图函数
    • 视图函数根据业务逻辑调用数据库获取相应的数据,然或根据模板渲染页面
    • 视图函数将响应的页面依次通过中间件
    • 到达wsgi,封装数据后反馈给客户端

    wsgi.png

    2. 什么wsgi

    Web服务器网关接口Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器Web应用程序框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

    WSGI区分为两个部分:一为“服务器”或“网关”,另一为“应用程序”或“应用框架”。在处理一个WSGI请求时,服务器会为应用程序提供环境信息及一个回调函数(Callback Function)。当应用程序完成处理请求后,透过前述的回调函数,将结果回传给服务器。

    所谓的 WSGI 中间件同时实现了API的两方,因此可以在WSGI服务器和WSGI应用之间起调解作用:从Web服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:

    • 重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。
    • 允许在一个进程中同时运行多个应用程序或应用框架。
    • 负载均衡和远程处理,通过在网络上转发请求和响应消息。
    • 进行内容后处理,例如应用XSLT样式表。

    实现该协议的模块:

    • wsgiref
    • werkzurg
    • uwsig

    3.视图的玩法

    FBV——url —— 函数

    CBV——url —— view

    4.RESTful规范

    什么是RESTful架构:

      (1)每一个URI代表一种资源;

      (2)客户端和服务器之间,传递这种资源的某种表现层;

      (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

    5.django rest framework框架

    1. 路由

    • 可以通过as_view传参数,根据请求方式不同执行相应的方法
    • 可以在url中设置一个结尾,类似于: .json

    2. 视图

    • 帮助开发者提供了一些类,并在类中提供了多个方法以供我们使用

    3. 版本

    • 在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同做不同处理

    4. 认证
    写一个类并注册到认证类,在类的的authticate方法中编写认证逻辑。

    • 认证成功(user,auth)
    • raise AuthticateFaild(....)
    • None

    5. 权限
    写一个类并注册到权限类,在类的的has_permission方法中编写认证逻辑。

    • True
    • False

    6. 频率限制
    写一个类并注册到频率类,在类的的 allow_request/wait 方法中编写认证逻辑。

    	allow_request
    		 True 
    		 False  如果返回False,那么就要执行wait
    

    7. 解析器

    • 根据ContentType请求头,选择不同解析器对 请求体中的数据进行解析。

    • POST /index/ http1.1. host:11.11.11.11 Content-Type:url-formendo.... user=alex&age=123

    • POST /index/ http1.1. host:11.11.11.11 Content-Type:application/json {....}

    8. 分页


    6. 页码越大速度越慢,为什么以及如何解决?

    原因:页码越大向后需要扫描的行数越多,因为每次都是从0开始扫描。
    解决:

    - 限制显示的页数
    - 记录当前页数据ID最大值和最小值,再次分页时,根据ID现行筛选,然后再分页。
    

    7. 三次握手与四次挥手

    答案详解:TCP握手与挥手

    二、 项目相关:

    1. 请讲一下你做的在线商城的表结构

    • 课程(13表)
      • 课程大类
      • 课程子类
      • 学位课
        • 讲师
        • 奖学金
      • 专题课(学位课模块表)
      • 价格策略(contenttype)
      • 课程详细(o2o -> 水平分表)
      • 常见问题
      • 课程大纲
      • 章节
      • 课时
      • 作业
    • 深科技(4+2)
      • 用户表
      • 用户token
      • 文章来源
      • 文章表
      • 通用评论表
      • 通用收藏表

    2. 支付宝功能

    • 加密方式:rsa
    • 公钥私钥:
      • 商户私钥
        • 支付宝公钥
    • 支付成功后,断电宕机
      • 成功:return HttpResponse('success')

    3. 数据库页数越大速度越慢,如何解决

    • 限制页数
    • 记录当前页最大ID、最小ID
    • 错误答案:
      • 扫描索引表
      • 再去数据库表中获取数据

    4. redis是什么?

    用于操作内存的软件。

    • 可以做持久化:

      • AOF
      • RDB
    • 相当于是大字典

    • 单进程单线程

    三、 Django

    1. 讲述一些ORM操作

    • select_related,连表操作,相当于主动做join

    • prefeth_related,多次单表操作,先查询想要的数据,然后构造条件,如:id=[1,2,3],再次查询其他表根据id做条件。

    • only

    • defer

    • F

    • Q

    • 通过ORM写偏原生SQL:

    1. extra
    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'])
    
    1. raw
    # 执行原生SQL
    models.UserInfo.objects.raw('select * from userinfo')
    
    # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
    models.UserInfo.objects.raw('select id as nid 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)
    
    1. 原生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() # fetchall()/fetchmany(..)
    
    1. 选择数据库
    queryset = models.Course.objects.using('default').all()
    

    ?、其他

    1. git的作用是什么

    进行版本控制,实现协同开发

    2. git命令与意义

    • git init
    • git add
    • git status
    • git commit
    • git log
    • git reflog
    • git reset --hard
    • git checkout
  • 相关阅读:
    flask_第一个程序
    Web框架_MVC vs MVT
    python_使用qrcode生成二维码
    HDU 4641
    SPOJ NSUBSTR
    SPOJ LCS2 多个串的最长公共子串
    SPOJ LCS 后缀自动机找最大公共子串
    POJ 1509 循环同构的最小表示法
    HDU 4821 字符串hash
    SPOJ GSS1 静态区间求解最大子段和
  • 原文地址:https://www.cnblogs.com/huang-yc/p/9899957.html
Copyright © 2011-2022 走看看