1、Web框架的本质是什么?为什么要有Web框架?

所有的Web应用,本质上其实就是一个socket服务端,用户端程序其实就是一个socket客户端。对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

2、请描述一个客户端请求从发起到返回的过程(用django来描述);
    https://www.cnblogs.com/fmgao-technology/p/9981573.html
3、请解释你对MTV和MVC架构的理解?
    https://www.cnblogs.com/fmgao-technology/p/9982016.html
4、请写出创建一个Django project的命令;
    django-admin.py startproject project_name
    特别是在 windows 上,如果报错,尝试用 django-admin 代替 django-admin.py 试试
5、请写出创建一个Django app的命令;
    python manage.py startapp app_name
6、请问Django project和Django app之间有什么区别和联系?
    project是工程,app是应用
    app必须依附于project
    project下可以有一个或者多个app,
    project下有全局的配置文件,静态文件、数据库、模板、自定义中间件、自定义标签等
    app目录下可以配置应用的orm模型、钩子、视图函数等
7、什么是WSGI?为什么我们需要WSGI?
    https://www.cnblogs.com/fmgao-technology/p/9981759.html
8、HTTP协议有哪些请求?请分别介绍他们;
    HTTP请求的方法:
    HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
    
    1、OPTIONS
    返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
    2、HEAD
    向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
    3、GET
    向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
    4、POST
    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
    5、PUT
    向指定资源位置上传其最新内容
    6、DELETE
    请求服务器删除Request-URL所标识的资源
    7、TRACE
    回显服务器收到的请求,主要用于测试或诊断
    8、CONNECT
    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
    注意:
    1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
    2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。

  
    get 和 post区别

  区别:

    get请求无消息体,只能携带少量数据

    post请求有消息体,可以携带大量数据

  携带数据的方式:

    get请求将数据放在url地址中

     post请求将数据放在消息体中

GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
    GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
    
9、请详细说明Django中间件处理请求的流程(各个处理函数的执行顺序);    
    https://www.cnblogs.com/fmgao-technology/p/9986887.html
10、描述你所知道的 django 常用命令, 并说下它们分别是作什么的 (e.g python manage.py shell (django项目环境终端));
    https://www.cnblogs.com/fmgao-technology/p/9986895.html
11、请问django中如何进行路由分发操作?
    re_path(r'^blog/', include('blog.urls')),  # 应用名blog
12、url中什么是无命名传参和有命名传参, 请说明如何添加额外的参数?
    有命名参数也是有名分组,传递的是参数名+参数值,视图中按照参数名取值
    无命名参数,传递的是参数值,视图中按照参数顺序取值
    添加额外的参数是url后面直接?拼接
13、一条url映射的view可以对应多个http请求操作吗
    可以,re_path(r'^articles/([0-9]{4})/$', views.year_archive),
14、django2.x 路由中的re_path和path的区别是什么?
    用正则表达式捕获值,需要使用re_path(),而不是path()。
    path可以实现转换器的功能,re_path不行
15、url反向解析使用的函数是什么, 需要配置什么?
    url.py文件中的路径中添加name属性
    视图中使用reverse函数解析路径
16、url中命名空间namespace可以起到什么作用?
    命名空间是表示标识符的可见范围
    在每一个新的命名空间A中可以定义任何标识符,A中的标识符不可以重复
    格式:re_path(r'^my_demo2/', include(("my_demo2.urls", "my_demo2"))),
    反向解析:reverse("my_demo2:index")
17、视图中处理请求的方式有几种
    https://www.cnblogs.com/fmgao-technology/p/9987418.html
18、请介绍视图中的请求(request)和响应(response)对象;
    https://www.cnblogs.com/fmgao-technology/p/9987609.html
    https://www.cnblogs.com/fmgao-technology/p/9988323.html
19、什么是orm?
    https://www.cnblogs.com/fmgao-technology/p/9988620.html
20、modules创建模型变化迁移和模型变化到数据库的命令是什么?
    python3 manage.py makemigrations
    python3 manage.py migrate
21、谈谈你对Django models通过类映射数据库表的理解;
    Model是继承自动生成的父类temporary_class,而temporary_class,则使用了元类ModelBase生成。通过orm映射连接数据库
22、多对多关系中的第三张表,也就是关系表如何创建?
    authors=models.ManyToManyField(to='Author',)
23、请介绍你了解的字段类型(e.g CharField );
    https://www.cnblogs.com/fmgao-technology/p/9989261.html
24、针对关系型数据库提供的关系操作字段分别是什么?
    https://www.cnblogs.com/fmgao-technology/p/9466639.html
25、请问如何自定制字段?
    
26、通过定义内部类Meta, 可以添加哪些参数(e.g, unique_together), 作用分别是什么?
    https://www.cnblogs.com/fmgao-technology/p/9989261.html
27、请写出在django中如何获取请求的数据,分别写出get和post的获取方式;
    1、GET请求
    request.GET["id"]
    request.GET.get("id")

2、POST请求
    request.POST["id"]
    request.POST.get("id")
28、all、filter、exclude方法有什么区别?
    all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。
    filter和exclude对queryset对象进行过滤,filter表示=,exclude表示!=。
29、get和filter操作出的结果集是什么数据类型, 有什么区别?
    get返回的是Model对象,类型为列表,说明使用get方法会直接执行sql语句获取数据,用get方法查询的时候,查询不到内容的时候会抛出异常,同样查询结果多余1条的时候也会抛出异常
    filer若是查询不到数据,会返回一个空的查询集,[]  type类型是:Queryset。查询到多余一条的时候会返回一个包含多个对象的查询集。
30、create和save方法有什么区别?
    create只能用于创建新的对象,在数据库层总是执行insert的操作。save不仅用于创建新的对象,也能用于更新对象的现有数据,在数据库层总是先执行update,找不到具体对象后再执行insert的操作。对于创建全新的对象,两者都可以。如果更新已有对象信息,只能用save()方法

31、ORM批量创建使用哪个方法, for循环去创建多条记录, 哪种更高效
    批量创建使用方法: bulk_create;批量插入更高效,for循环每次插入一条数据都要进行数据库操作,数据量大的话会十分影响数据库性能

32、ORM如何保存 外键 和 多对多 字段
    外键:django.db.models.ForeignKey(verbose_name='作者', to='UserInfo', to_field='nid', null=True,  on_delete=models.CASCADE)
    多对多1:tags = models.ManyToManyField(
        to='Tag',
        through='Article2Tag',
        through_fields=('article', 'tag'),
    )
    多对多2:class Article2Tag(models.Model):
                nid = models.AutoField(primary_key=True)
                article = models.ForeignKey(verbose_name='文章', to='Article', to_field='nid', on_delete=models.CASCADE)
                tag = models.ForeignKey(verbose_name='标签', to='Tag', to_field='nid', on_delete=models.CASCADE)

class Meta:
                    unique_together = [
                        ('article', 'tag'),
                    ]

33、QuerySet切片映射到数据库sql对应什么操作?
    
34、排序使用什么方法, 正序、倒序, 分别使用什么参数?
    正序:order_by('check_in')
    倒序:order_by('-check_in')
    
35、QuerySet 支持查询的api(大约有24种) 分别有什么并指出它们的含义?例如: field field_name__exact, field_name__endswith 至少描述10种以上
    field_name="abc"  等于
    field_name__exact="abc"  严格等于
    field_name__iexact="abc"  不区分大小写等于
    field_name__contains="abc"  包含
    field_name__icontains="abc"  不区分大小写包含
    field_name__regex="^abc"  以abc开头
    field_name__iregex="^abc"  不区分大小写开头
    field_name__gt=15  大于
    field_name__lt=15  小于
    field_name__gte=15  大于等于
    field_name__lte=15  小于等于
    field_name__ne=15  不等于
    field_name__startswith="abc"  以什么开头
    field_name__istartswith="abc"  
    field_name__endswith="abc"  以什么结尾
    field_name__month="12"  月份
    field_name__year="2018"  年份
    
36、如何跨表操作?
    https://www.cnblogs.com/fmgao-technology/p/9472828.html
    
40、请描述 django 中 settings 机制    
    https://www.cnblogs.com/fmgao-technology/p/10118781.html
    
41、QuerySet 提供的性能相关的方法有哪些, 例如 select_related 和 prefetch_related 它们的区别是什么
    https://www.cnblogs.com/fmgao-technology/p/10119281.html#_labelTop
    
42、if queryset.exists 和 if queryset 那种效率更高效?
    但有时我们只希望了解查询的结果是否存在,而不需要使用整个数据集,这时if触发整个queryset的缓存变成了一件坏事情。哎,程序员要担
    心的事情着不少。这时你可以用exists()方法。与if判断不同,exists只会检查查询结果是否存在,返回True或False,
    而不会缓存queryset

43、queryset.count() 和 len(queryset) 那种效率更高效?    
    注意:使用 count 方法可以确定一个 QuerySet 中有多少记录。Python 的 len 方法会进行全面的计算,然后统计那些以记录形式返回的行数,而 count 方法执行的则是真正的 SQL COUNT 操作,其速度更快。我们这样做,数据库管理员会感激我们的。

44、queryset中提供了执行原生 sql 的 api 是哪些方法?
    https://www.cnblogs.com/fmgao-technology/p/10119671.html#_label4

45、如何利用orm进行子查询操作?
    obj = models.Account.objects.filter(username="zhangsan")
    res = models.ArticleTwo.objects.filter(account=obj.first().id).values_list()
    
    print(res) # <QuerySet [(1, 'mysql权威指南', 'MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一', 1, datetime.datetime(2016, 11, 12, 0, 0), 2), (2, 'oracle权威指南', 'Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品', 1, datetime.datetime(2016, 11, 12, 0, 0), 2)]>

------------------------编程题-------------------------------
    
1、请使用socket模块实现一个简单的web服务器
    import socket

sock = socket.socket()
    sock.bind(("127.0.0.1", 8800))
    sock.listen(5)

while True:
        print("server.................")
        conn, addr = sock.accept()  # conn客户端套接字,
        data = conn.recv(1024)

conn.send(('HTTP/1.1 200 OK\r\n\r\n%s' % 'OK').encode("utf-8"))  # HTTP/1.1 200 OK\r\n\r\n这个是固定格式
        conn.close()

2、请写一个基于class的视图,返回字符串“Hello World”给客户端;
    urls.py
    from app01.views import MyView
    re_path(r'^index/$', MyView.as_view()),
    
    views.py
    from django.http import HttpResponse
    from django.views import View

class MyView(View):
        def get(self, request):
            return HttpResponse('Hello World')
            
3、请写一个视图函数,该函数判断客户端请求类型,如果是POST请求,打印"post",如果是GET请求,则打印"get";
    def func_method(request):
        if request.method == 'POST':
            print("post")
        elif request.method == 'GET':
            print("get")

4、请写一个module名为Account,分别有username, email, password, register_date, signature字段;

class Account(models.Model):
        """账户信息表"""
        username = models.CharField(max_length=64, unique=True)
        # EmailField的本质也是CharField,Django在此基础上做了格式验证,数据库中没有对应的email字段类型
        email = models.EmailField()
        password = models.CharField(max_length=128)
        register_date = models.DateTimeField(verbose_name="注册日期", auto_now_add=True)
        signature = models.CharField(verbose_name="签名", max_length=128, blank=True, null=True)

5、请写一个module名为Article,分别有title, content, account, pub_date, read_count字段;
    class ArticleTwo(models.Model):
        """文章表"""
        title = models.CharField(max_length=255, unique=True)
        content = models.TextField("文章内容")
        account = models.ForeignKey(to="Account", verbose_name="作者", on_delete=models.CASCADE)
        tags = models.ManyToManyField(to="TagTwo", blank=True)
        pub_date = models.DateTimeField()
        read_count = models.IntegerField(default=0)

6、请写一个module名为Tag,分别有name, date字段;
    class TagTwo(models.Model):
        """文章标签表"""
        name = models.CharField(max_length=64, unique=True)
        date = models.DateTimeField(auto_now_add=True)

8、请使用orm分别插入数据到Account、ArticleTwo、TagTwo表中;
    # obj = models.Account.objects.create(username="zhangsan", email="123@qq.com", password="123", signature="张三")
    # obj = models.Account.objects.create(username="lisi", email="123@qq.com", password="123", signature="李四")
    obj = models.Account.objects.create(username="zhaoliu", email="123@qq.com", password="123", signature="赵六")

obj = models.ArticleTwo.objects.create(title="oracle权威指南",
                                           content="Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品"
                                           , account_id=1, pub_date="2016-11-12", read_count=2)
    web = models.TagTwo.objects.filter(name="web").first()
    data = models.TagTwo.objects.filter(name="数据库").first()
    obj.tags.add(web, data)

9、请使用orm查询每一个account发表的文章数,按倒序排列;
    obj = models.Account.objects.all().annotate(c=Count("articletwo__id")).values_list("username","c").order_by("-c")
    
10、请使用orm查询每一篇文章的title, content, username, email;
    obj = models.ArticleTwo.objects.all().values_list("title", "content", "account__username", "account__email")
    或者:
    # obj = models.ArticleTwo.objects.all()
    # for ob in obj:
    #     # print(ob)
    #     print(obj.title)
    #     print(ob.content)
    #     print(ob.account.username)
    #     print(ob.account.email)

django练习题的更多相关文章

  1. Django多表查询练习题

    #一 model表:from django.db import models # Create your models here. class Teacher(models.Model): tid=m ...

  2. Django学习之ORM练习题

    一.表关系 创建表关系,并创建约束 班级表:class 学生表: student cid caption grade_id sid sname gender class_id 1 一年一班 1 1 乔 ...

  3. Django 多表查询练习题 Q查询 F查询 聚合 分组

    -------------------------------------------------自己偷的懒,或许用加倍时间也补不回来,珍惜现在的拥有的时光,把我现在! 上节回顾 基于对象的跨表查询( ...

  4. django写的留言板

    代码见 https://github.com/linux-wang/show-me-the-code/tree/master/dj_test 实际上是 https://github.com/linux ...

  5. day67 ORM模型之高阶用法整理,聚合,分组查询以及F和Q用法,附练习题整理

    归纳总结的笔记: day67 ORM 特殊的语法 一个简单的语法 --翻译成--> SQL语句 语法: 1. 操作数据库表 创建表.删除表.修改表 2. 操作数据库行 增.删.改.查 怎么连数据 ...

  6. Django之REST framework源码分析

    前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...

  7. Django(ORM查询联系题)

    day70 练习题:http://www.cnblogs.com/liwenzhou/articles/8337352.html import os import sys if __name__ == ...

  8. 9.14.16 Django ORM进阶用法

    2018-9-14 14:26:45 ORM 练习题   : http://www.cnblogs.com/liwenzhou/articles/8337352.html 2018-9-14 21:1 ...

  9. 第六模块:WEB框架开发 第1章·Django框架开发50~87

    51-表关系之一对多 52-表关系之多对多 53-表关系之一对一 54-数据库表关系之关联字段与外键约束 55-数据库表关系之sql创建关联表 56-ORM生成关联表模型 57-多表操作之一对多添加记 ...

随机推荐

  1. python super()函数

    super()函数是用来调用父类(超类)的一个方法 super()的语法: python 2 的用法: super(Class, self).xxx  # class是子类的名称 class A(ob ...

  2. mysql之 mysql_config_editor/login-path 登录密码保护

    login-path是MySQL5.6开始支持的新特性.通过借助mysql_config_editor工具将登陆MySQL服务的认证信息加密保存在.mylogin.cnf文件(默认位于用户主目录) . ...

  3. docker 容器的使用

    本文使用centos7 1 ,docker 安装:  yum install docker; 2 启动 docker: service docker start; 3 开机启动docker: chkc ...

  4. Linux 命令之删除命令

    在Linux下删除文件用rm命令,具体用法如下: rm [选项] 文件 选项说明: -f -force 忽略不存在的文件,强制删除,无任何提示 -i --interactive 进行交互式地删除 -r ...

  5. Day 02 编程语言介绍及运行python

    一.编程语言介绍 1.1.机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件. 1.2.汇编语言:用英文标签取代二进制指令编写程序,本质也是在直接控制硬件. 1.3.高级语言:用人能理解的 ...

  6. OpenCV几种访问cv::Mat数据的方法

    一般来说,如果是遍历数据的话用指针ptr比用at要快.特别是在debug版本下.因为debug中,OpenCV会对at中的坐标检查是否有溢出,这是非常耗时的. 代码如下 #include <op ...

  7. java架构师之路--推荐书籍

    1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选 ...

  8. Linux常用命令之定时任务

    定时任务的实现,可以让我们把很多重复的,有规律的事情交给机器做.我们就不用苦逼的烦躁做同一件事,这样也让我们做程序的有更多的乐趣和价值.用技术的手段解决常人花时间精力解决的问题.在Linux下实现定时 ...

  9. sort a given string

    my solution: function order(words){ var splitToArr = words.split(' '), len = splitToArr.length, newA ...

  10. mycat配置安装测试

    https://www.jianshu.com/p/26513f428ecf #下载安装#java jdk mkdir /usr/local/java/tar -zxvf jdk-7u80-linux ...