一、如何查看Django版本
命令行cmd -> python
1.>>>import django
print(django.VERSION)
(4, 0, 0, 'final', 0)
2.>>> django.get_version()
4.0'
二、概述{% csrf_token %}的作用
**原因是django为了用户提交表单时防止跨站攻击所做的保护,只需在HTML文件的表单中添加{% csrf_token %}便可以解决问题。
django为用户实现防止跨站请求伪造的功能,通过中间件django.middleware.csrf.CsrfViewMiddleware来完成。
当用post提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会报错,这也是之前我们一直将其注释的原因。**
全局:django.middleware.csrf.CsrfViewMiddleware
局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件
三、 Hello World 是所有项目入门时都要完成的一个小功能。现在需要你使用 Django 来开发一个网站的首页,这个首页只需要显示 Hello, world! 的字样即可。使用浏览器访问 http://localhost:8000/ 时,返回给浏览器的内容中需要包含 Hello, world! 这个字符串,且 response 的 status code 是 200。
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(requset):
response = HttpResponse('Hello, world!', status = 200)
return response
四、 实现一个功能,能够统计当前系统中已注册的用户数量,要求返回一个用户数量的数字。
from django.contrib.auth.models import User
from django.http.response import HttpResponse
def index(request):
# write your code here
count = User.objects.count()
return HttpResponse(count)
五、 请完善在 users/services.py 中的方法UserService.get_or_create_user_by_username, 对于一个规定的 username, 如果已经存在一个用户使用了这个 username, 则返回这个用户的 User Object。如果不存在,则使用这个 username 创建一个新的用户,并且返回这个用户的 User Object。
解法一
from django.contrib.auth.models import User
class UserService(object):
@classmethod
def get_or_create_user_by_username(cls, username):
# -- write your code here --
user, isCreated = User.objects.get_or_create(username = username)
return user
解法二
from django.contrib.auth.models import User
class UserService(object):
@classmethod
def get_or_create_user_by_username(cls, username):
# -- write your code here --
try:
user = User.objects.get(username = username)
except:
user = User(username = username)
user.save()
return user
六、 这个题是一个 Bug Fix 的训练。我们按照教程 Django Rest Framework Install Tutorial 中的指引来安装 django 和 django-rest-framework 的环境,但是在访问主页http://localhost/ 的django.template.exceptions.的时候,代码抛出这样一个异常 TemplateDoesNotExist: rest_framework/api.html 你能来帮忙 debug 一下修复这个 bug 么?
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework' # 这行是需要添加的代码
]
七、 这道题是一个 Bug Fix 训练,代码里提供了一个 API 用于帮助用户注册账号,但是里面有一些 bug。当我们调用 Signup 的 API 的时候,抛出了如下异常信息 AssertionError: The field 'emial' was declared on serializer SignupSerializer, but has not been included in the 'fields' option. 请你过一下代码并修复所有bugs。
解决该问题主要是查找报错中的‘emial’在我们代码的什么地方,快捷键ctrl+F查找每个代码页,发现该单词在serializers.py中出现
serializers.py
class SignupSerializer(serializers.ModelSerializer):
username = serializers.CharField(max_length=20, min_length=6)
password = serializers.CharField(max_length=20, min_length=6)
email = serializers.EmailField() # 题目本来的代码为emial
八、 请写一个 Django queryset 用来查询所有教师的信息并按照年龄升序排序。teachers.models.Teacher 作为存储教师信息的 Model。
from teachers.models import Teacher
class TeacherService(object):
@classmethod
def get_teachers_order_by_age(cls):
# -- write your code here --
return Teacher.objects.all().order_by('age')
order_by(*fields) 默认情况下,QuerySet 返回的结果是按照模型 Meta 中的 ordering 选项给出的排序元组排序的。可以通过使用 order_by 方法在每个 QuerySet 的基础上覆盖这一点。 举例: Entry.objects.filter(pub_date_year=2005).order_by(‘-pub_date’, ‘headline’) 上述结果将按 pub_date 降序排列,然后按 headline 升序排列。“-pub_date” 前面的负号表示 降序。升序是隐含的。
九、 请写一个 Django queryset 用来查询所有年龄超过n 岁教师的信息。
from django.db.models import QuerySet
from teachers.models import Teacher
class TeacherService(object):
@classmethod
def filter_teachers_by_age(cls, age: int) -> QuerySet:
# -- write your code here --
# 方法一
return Teacher.objects.filter(age__gt = age)
# 方法二
qs = Teacher.objects.all()
return qs.filter(age__gt = age)
Django | 查找 |
---|
__gt | 大于 | __gte | 大于等于 | __lt | 小于 | __lte | 小于等于 | __contains | 模糊查找 |
十、 请写一个 Django queryset 查询所有邮箱为某个domain邮箱的教师信息。domain取值可以为 qq.com 或者 163.com 等。
from django.db.models import QuerySet
from teachers.models import Teacher
class TeacherService(object):
@classmethod
def filter_teachers_by_domain(cls, domain: str) -> QuerySet:
# -- write your code here --
# 方法一
return Teacher.objects.filter(email__endswith='@{}'.format(domain))
# 方法二
return Teacher.objects.filter(email__endswith=(‘@’+domain))
endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。
Django | 判断 |
---|
+__isnull | 判断此字段为空 | +__startswith | 判断属性由某字符串开始的行 | +__endswith | 判断属性由某字符串结束的行 | +__contains | 判断属性包含某字符串的行 |
|