zoukankan      html  css  js  c++  java
  • django练习题

    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 %s' % 'OK').encode("utf-8"))  # HTTP/1.1 200 OK 这个是固定格式
            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)

           

  • 相关阅读:
    利用 pandas库读取excel表格数据
    Spark学习笔记3——RDD(下)
    Spark学习笔记2——RDD(上)
    Spark学习笔记1——第一个Spark程序:单词数统计
    Spark学习笔记0——简单了解和技术架构
    java标识符和关键字
    数据库事务ACID特性(原子性、一致性、隔离性、持久性)
    大数据系统的运行
    虚拟机和hadoop
    大数据基础1
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/10120142.html
Copyright © 2011-2022 走看看