视图系统是一个视图函数类,简称视图,是一个简单的python函数(类),它可以接受web请求并且返回web响应。这个相应可以是一个网页,一个重定向,一个404错误或者是一个简单的字符串。在Django中,有请求就必须要有响应。因此,无论视图系统本身包含什么逻辑,都要返回响应。大家约定俗成地将视图放置在项目(project)或程序(app)目录下的名为views.py的文件中。
在视图系统可以分为FBV(function base view)与CBV(class base view),即基于函数的view与基于类的view。
注意:在创建基于类的view时,需要继承View类以及重写get和post方法,并且在路由设置时,要特别注意:
模块名.类名.as_view()
比如在用户注册账号时,需要上传图片,或者用户根据自己的需要上传自己的文件,此时就需要用到文件上传文件的功能,包括并且不仅限于图片,视频等。
file = request.FILES.get(‘upload_name’)
file_name = file.name
with open(file_name,’wb’) as f:
for i in file.chunks()
f.write(i)
当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。
Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。
•path_info : 返回用户访问url,不包括域名
•method : 请求中使用的HTTP方法的字符串表示,全大写表示。
•GET : 包含所有HTTP GET参数的类字典对象
•POST :包含所有HTTP POST参数的类字典对象
•body :请求体,byte类型 request.POST的数据就是从body里面提取到的
1.HttpRequest.scheme
表示请求方案的字符串(通常为http或https)
2.HttpRequest.path
一个字符串,表示请求的路径组件(不含域名)。
例如:"/music/bands/the_beatles/"
3.HttpRequest.method
一个字符串,表示请求使用的HTTP 方法。必须使用大写。例如:“GET”、“POST”
4.HttpRequest.encoding
一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 ‘utf-8’)。
5.HttpRequest.GET
一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。
6.HttpRequest.POST
一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
7.HttpRequest.COOKIES
一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
8.HttpRequest.META
一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
CONTENT_TYPE —— 请求的正文的MIME 类型。
HTTP_ACCEPT —— 响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
HTTP_HOST —— 客服端发送的HTTP Host 头部。
HTTP_REFERER —— Referring 页面。
HTTP_USER_AGENT —— 客户端的user-agent 字符串。
QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
REMOTE_ADDR —— 客户端的IP 地址。
REMOTE_HOST —— 客户端的主机名。
REMOTE_USER —— 服务器认证后的用户。
REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
SERVER_NAME —— 服务器的主机名。
SERVER_PORT —— 服务器的端口(是一个字符串)。
9.HttpRequest.FILES
一个类似于字典的对象,包含所有的上传文件信息。
FILES 中的每个键为 中的name,值则为对应的数据。
注意,FILES 只有在请求的方法为POST 且提交的 带有enctype=“multipart/form-data” 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象。
10、HttpRequest.get_full_path() 方法返回 path,如果可以将加上查询字符串。
例如:"/music/bands/the_beatles/?print=true"
在python中,可以定义一个简单数据库,达到存储数据的目的。但是功能有限,只能作为测试代码功能的简单用图。
ORM:O–>OBJECT,R–>RELATION,M–>MAPPING
即使用面向对象的思想来建立与操作数据库
在python中的类可以看成对应数据库中的一张表
在python中的对象可以看成对应表中的一条记录
在python中的类属性则对应相应表格中的字段
他们之间的关系可以表示成下面的图片
Django中的数据库配置已经被设置好了,但是如果要连接如mysql,sqlserver,oracle等主流数据库时,就需要手动在项目中的setting文件中配置路径,账号密码,端口等信息。
以配置mysql数据库为例:
运行测试,并未报错
注意: django==2.1.2 需要使用mysql 5.5 以上的版本。
class Person(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
height = models.DecimalField(max_digits=5, decimal_places=2)
weight = models.FloatField()
birthday = models.DateField()
使用命令:
python manage.py makemigrations
python manage.py migrate
第一种:类名.objects.create(属性名称=xxx,属性名称=yyy)
第二种为类实例化的方法:
对象名=类()
对象名.属性名称=xxx
对象名.save()
def add_user(request):
if request.method == 'POST':
name = request.POST.get('username')
age = request.POST.get('age')
height = request.POST.get('height')
weight = request.POST.get('weight')
birthday = request.POST.get('birthday')
models.Person.objects.create(
name=name,
age=age,
height=height,
weight=weight,
birthday=birthday,
)
# obj = models.Person()
# obj.name = name
# obj.age = age
# obj.weight = weight
# obj.height = height
# obj.save()
return HttpResponse('注册成功')
return render(request,'app_2/add_user.html')
语法:
类名.objects.all()
注:all()方法可以获取所有的记录
在HTML中的代码块:
<table>
<tr>
<th>序号th>
<th>姓名th>
<th>年龄th>
<th>身高th>
<th>体重th>
<th>生日th>
<th>操作th>
tr>
{% for user in user_list %}
<tr>
<td>{{ forloop.counter }}td>
<td>{{ user.name }}td>
<td>{{ user.age }}td>
<td>{{ user.height }}td>
<td>{{ user.weight }}td>
<td>{{ user.birthday |date:'y-m-d'}}td>
<td>
<a href="#">修改a>
<a href="#">删除a>
td>
tr>
{% endfor %}
table>
同样有两种方式:
第一种:类名.objects.filter(‘xxx’).update(‘xxxx’)
第二种:类实例化
对象名 = 类名.objects.get(‘xxx’)
对象名.属性名 = 新值
对象名.save()
第一种方法实例:
def update_user(request):
if request.method == 'POST':
id = request.POST.get('id')
name = request.POST.get('username')
age = request.POST.get('age')
height = request.POST.get('height')
weight = request.POST.get('weight')
birthday = request.POST.get('birthday')
models.Person.objects.filter(id=id).update(name=name,age=age,height=height,weight=weight,birthday=birthday)
return redirect('/app_2/show_user/')
else:
id = request.GET.get('id')
user_info = models.Person.objects.get(id=id)
return render(request,'app_2/update_user.html',{'user_info':user_info})
两种语法:
第一种:类名.objects.get(xxx).delete()
第二种:类名.objects.filter(xxx).delete()
def del_user(request):
id = request.GET.get('id')
# models.Person.objects.filter(id=id).delete()
#或者
models.Person.objects.get(id=id).delete()
return redirect('/app_2/show_user/')