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)