django练习题

时间:2023-03-09 02:54:51
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\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)