django复习


Django回顾

1 web应用
本质是基于socket实现的应用程序

浏览器-----------服务器

2 http协议:应用层协议
1 基于TCP协议
2 基于请求响应
3 短连接
4 无状态保存(引入了cookie,session技术)

请求协议
浏览器----------->服务器
<------------
响应协议

请求协议
''
请求首行 GET path?get数据 HTTP/1.1
请求头

userAgent: win Chorome/IPhone
contentType:json application/x-www-form-urlencoded
空行
请求体(post才有请求体)
a=1&b=2
{"a":1,"b":2}
''

如何给服务器发送json数据
给服务器发送请求方式:
1 地址栏 get请求
2 form表单 get post请求 (无法发送json数据)
3 a标签连接请求 get请求
4 Ajax请求 get(查) post(提交数据添加记录) put(更新) delete(删除) ......

$.ajax({
url:"/index/",
type:"post",
data:{
a:1,
b:2
}, # 默认urlencoded编码
success:function(res){


}

})


发送json数据

$.ajax({
url:"/index/",
type:"post",
contentType:"json"
data:JSON.stringfy({
a:1,
b:2
}),
success:function(res){


}

})



注意:Django解析不了json数据,只能自己利用request.body解析



响应协议
响应首行 HTTP/1.1 200 OK
响应头
contentType:"json"
...
空行
响应体

响应状态码:
1开头: 请求中
200:请求成功
3开头:重定向
4: 文件路径找不到
5:服务器错误




Django

MTV+url路由分发:
M: model.py
T: Template:存放模板文件
V: 视图 逻辑



url路由分发:

反向解析:
url(r'^role/add/$', views.role, name='role_add'),
url(r'^role/edit/(\d+)/$', views.role, name='role_edit'),

视图:

path=reverse("role_add") # "role/add/"
path=reverse("role_edit",args=(1,2)) # "role/edit/1/"


模板:
{% url 'role_add' %}
{% url 'role_edit' 2 %}

名称空间:
re_path(r'^app01/', include(("app01.urls","app01"),namespace="app01",)),


视图函数:

request对象:存储这次请求所有请求信息:
属性:
HttpRequest.GET
HttpRequest.POST
---- urlencoded编码
---- 注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
request.POST.getlist("hobby")
HttpRequest.body 一个字节串,代表请求报文的主体。
HttpRequest.path
ttpRequest.method
HttpRequest.META 请求头
HttpRequest.FILES
HttpRequest.COOKIES
HttpRequest.session session中间件 源码
HttpRequest.user 认证中间件 源码

方法:
HttpRequest.get_full_path()
HttpRequest.is_ajax()

HttpResponse对象:
obj=HttpResponse("hello")
obj=render(request,"index.html")
obj=redircet("/index/")


FBV与CBV : ******源码流程

views:
from django.views import View
class BookView(View):

def get(self,request):
pass

def post(self,request):
pass
urls.py:
url("books",BookView.as_view())

 

模板层:

含有模板语法的html文件成为模板文件
render方法渲染引擎
模板语法:

{{}}:渲染变量
---- 深度查询 句点符. 注意: .无参方法
---- 过滤器 date,safe,add,slice,
{% %}:渲染标签
{%for i in [111,222,333]%}
{%if i!= 222%}
<p>i</p>
{%endif%}
{%endfor%}

自定义标签和过滤器
1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
2、 在app中创建templatetags模块(模块名只能是templatetags)
3、 创建任意 .py 文件,如:my_tags.py
from django import template
register = template.Library() #register的名字是固定的,不可改变

@register.filter
def filter_multi(v1,v2):
return v1 * v2

@register.simple_tag
def simple_tag_multi(v1,v2):
return v1 * v2


4、模板中使用:
{% load my_tags %}

# num=12
{{ num|filter_multi:2 }} #24

{{ num|filter_multi:"[22,333,4444]" }}

 

继承 extend:
创建base.html:
构建钩子
{%block css%}

{%endblock css%}

{%block content%}
<p>123</p>
{%endblock%}

{%block js%}

{%endblock js%}
子模板继承:
{%extends 'base.html' %}

{%block content%}
<p>111</p>
{%endblock%}

ORM:
class Book(model.Model):
title=models.CharFiled(max_length=32)


类-----------------表 # Book------- app01_book
属性变量-----------字段 # title------ title
属性对象-----------约束 # models.CharFiled(max_length=32)
类实例对象---------表记录


单表操作

model的元类信息:
Book._meta.verbose_name
'书籍'
Book
<class 'app01.models.Book'>
Book._meta.model_name
'book'
Book._meta.app_label
'app01'
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name="书籍名称")


def __str__(self):
return self.title
class Meta:
app_label="APP01"
db_table="app01book"
unique_together=["title","price"]
verbose_name="书籍"
ordering=["price"]


class Book(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
state=models.BooleanField()
pub_date=models.DateField()
price=models.DecimalField(max_digits=8,decimal_places=2)
publish=models.CharField(max_length=32)


更多参数:
(1)null

如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.

blank

如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。

(2)default

字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。

(3)primary_key

如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。

(4)unique

如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的

(5)choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。

数据库配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'bms',      # 要连接的数据库,连接前需要创建好
'USER':'root',       # 连接数据库的用户名
'PASSWORD':'',       # 连接数据库的密码
'HOST':'127.0.0.1', # 连接主机,默认本级
'PORT':3306     # 端口 默认3306
},

'app01': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'bms',      # 要连接的数据库,连接前需要创建好
'USER':'root',       # 连接数据库的用户名
'PASSWORD':'',       # 连接数据库的密码
'HOST':'127.0.0.1', # 连接主机,默认本级
'PORT':3306     # 端口 默认3306
},

}



添加记录:



类装饰器
imageField
FileField
media

数据库备份命令


https://www.cnblogs.com/yuanchenqi/articles/6755717.html

posted @ 2018-11-22 19:38  RootEvils  阅读(79)  评论(0)    收藏  举报