备注:
- 【】:主标题
- ():副标题
github地址:
一个大的软件是由许多软件模块组成的,每一个软件模块都有其自身的功能,所有功能的组合就完成了一个软件的开发
大项目分解成小的模块,每个模块分配给不同的人去完成
架构层 | 功能 |
---|---|
Model 模型层 | 包含应用程序的核心(数据库记录列表) |
View 视图层 | 显示数据(数据库记录) |
Controller 控制层 | 数据处理(写入数据库) |
(1)用户通过浏览器提交数据给服务器
(2)控制器C 接收数据并处理数据
(3)控制器C 调用 模型M
(4)模型M 将数据保存到数据库
(5)数据库将结果返回给 模型M
(6)模型M 将结果再返回给 控制器C
(7)控制器C 调用 视图V 生成HTML页面
(8)视图V 将HTML页面返回给控制器C
(9)控制器C 将HTML页面返回给浏览器,用户就可以看到了
(1)Model 模型:功能与MVC架构中的一致
(2)View 视图:功能相当于控制器C—调用模型M和模板T
(3)Template 模板:功能相当于MVC中的视图V—产生HTML页面
>>> django-admin startproject BookManager(项目名)
创建完成后会生成几个文件:
(1)manage.py
:项目运行管理入口
(2)__init__.py
:空文件,代表文件夹可以作为python包使用
(3)settings.py
:项目的整个配置文件
(4)urls.py
:项目的URL路由配置
(5)wsgi.py
:项目与WSGI兼容的Web服务器接口(网关接口)
(6)asgi.py
:项目部署时的文件
>>>python manage.py startapp Book(应用名)
一个Django项目由许多应用app组成,每一个应用对应一个功能
(1)admin.py
:后台的站点管理文件,管理后台
(2)__init__.py
:可以被当作python包
(3)migration文件夹:模型迁移
(4)models.py
:MVT架构中的模型M,处理数据
(5)test.py
:测试
(6)views.py
:MVT架构中的视图V,处理业务逻辑
- 在项目settings.py文件中,添加我的应用
>>>python manage.py runserver
在许多的框架中,ORM应用广泛,Django中的Model模型也采用了ORM
将
models.py
中类生成的对象直接映射成数据库中的表,完成模型设计的同时也完成了数据库设计
(1)面向对象编写时也面向了数据库编写
(2)不用写复杂的SQL语句
(3)将数据的操作转化为类中的函数和属性
(1)面向对象编程难免会比直接SQL语句的性能差一些,映射的过程中丧失了性能
(1)
BooleanField
:布尔字段
(2)NullBooleanField
:Null、True、False三种字段
(3)CharField(max_length=)
:字符串
(4)TextField
:大文本字段,一般大于等于4000个字符
(5)InteerField
:整数类型
(6)FloatField
:浮点数
(7)DateField(auto_now=False, auto_now_add=False)
:日期,auto_now代表当前时间用于最后一次修改的时间戳,auto_now_add代表当前时间用于创建的时间戳
(8)FileField
:文件类型
(9)ImageField
:继承FileField,对上传的内容进行校验,确保是有效的图片
class BookInfo(models.Model):"""图书模型"""book_title = models.CharField(max_length=20) # 图书名book_date = models.DateField() # 图书出版日期def __str__(self):return self.book_title
class People(models.Model):"""人物模型"""name = models.CharField(max_length=20)age = models.IntegerField() # 整数类型people_book = models.ForeignKey('BookInfo', on_delete=models.CASCADE, related_name='book_peoples')def __str__(self):return self.name
(1)产生关联,一本书中会有多个人物,一对多模型
(2)on_delete=models.CASCADE
:级联,一个删除另一个也删除
(3)related_name=""
:反向连接,反向调用时使用
即将面向对象编写的程序对应成数据库的表
>>>python manage.py makemigrations
- 会在migrations文件下生成迁移文件
实现ORM与数据库的映射
>>>python manage.py migrate
>>>python manage.py shell
>>> from datetime import date
>>> book.book_date = date(2020, 1, 1)
参考:【Django入门】——Python的交互式shell快速尝试试验模型API
(1)开发网站时,我们往往需要对数据库表中的数据进行增、删、改、查
(2)方便管理
(3)Django中的admin.py
用于管理后台
>>>python manage.py createsuperuser
运行服务器后(
python manage.py runserver
)在浏览器网址输入127.0.0.1:8000/admin
登录进入后台
settings.py
文件中操作:# LANGUAGE_CODE = 'en-us' # engilsh
LANGUAGE_CODE = 'zh-hans' # Chinese#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
admin.py
文件中注册模型,这样在管理页面就会出现你的模型dels import ister(BookInfo)
dels import BookInfoclass BookInfoAdmin(admin.ModelAdmin):"""自定义管理页面"""list_display = ['id', 'book_title', 'book_date']# 必须要放在一起注册,因为BookInfoAdmin类中没有模型,不符合Django模型注册规则
ister(BookInfo, BookInfoAdmin)
(1)Django中,通过浏览器去请求一个页面时,视图函数就是那个控制器,视图函数调用模板生成HTML页面,并返回给浏览器
(2)视图函数必须带一个参数:request
"""官方例子"""
from Book import viewsurlpatterns = [path('articles/2003', views.函数名, name='……'),path('articles/<int:year>/', views.函数名, name='……'),path('articles/<int:year>/<int:month>/', views.函数名, name='……'),
]
< : >
:从URL中提取值
from Book import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/', views.index, name='index'),path('study/', views.study, name='study'),path('books/', views.show_books, name="show_books"), # 显示图书信息path('books/<int:ID>', views.details_books, name="details_books"),path('area/', views.AreaInfo, name="areas"),path('login/', views.login, name="login"),path('login_submit/', views.login_submit, name="login_submit")
]
TEMPLATES
的绝对路径DIRS
(1)修改DIRS,添加templates文件夹的路径
(2)BASE_DIR:项目的绝对路径
TEMPLATES = [{'BACKEND': plate.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')], # 模板目录'APP_DIRS': True,'OPTIONS': {'context_processors': [t_processors.debug',quest',t_processors.auth',ssages',],},},
]
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>小杨</title></head><body><h1>我是小杨我就这样——{{ name }}</h1><hr />{% for i in datas %}<li>{{ i }}</li>{% endfor %}</body>
</html>
from django.http import HttpResponse
plate import loader
dels import BookInfodef index(request):temp = _template('Book/index.html') # 加载模板文件,生成一个模板对象context = {'name': '小杨', 'datas': list(range(1, 20))} # 给模板传数据html = der(context) # 渲染模板,生成html页面return HttpResponse(html) # 返回给浏览器html页面es
上述代码等价于:
dels import BookInfodef index(request):return render(request, 'Book/index.html', {'name':'小杨', 'datas':list(range(1, 20))})
视图函数调用模板中的html文件时—利用字典传数据
from Book import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/', views.index, name='index'),
运行服务器后,在浏览器网址输入
127.0.0.1:8000/index/
在templates/Book文件夹下创建 books.html 文件和 details.py 文件
在views.py中编写 show_books 函数
books.html文件
<! DOCTYPE html>
<html lang='en'><head><meta charset="utf-8"><title>Show Books</title>
</head><body><h1>图书信息如下:</h1><ul>{% for i in books %}<li><a href="{{ i.id }}">{{ i.book_title }}</a></li>{% endfor %}</ul>
</body></html>
<! DOCTYPE html>
<html><head><meta charset="utf-8"><title>people_info</title>
</head><body><h1>{{ book.book_title}}:</h1>{% for i in people %}<li>人物名称: {{ i.name }}----年龄: {{ i.age }}</li> {% empty %}<li>无相关信息</li>{% endfor %}
</body></html>
def show_books(request):"""显示图书网页"""# 通过模型M查找数据库中的书籍信息book = BookInfo.objects.all()# 把数据返回HTML文件temp = _template('Book/books.html')context = {'books': book}html = der(context)return HttpResponse(html)def details_books(request, ID):"""显示图书信息"""# 根据ID查找书籍book = (id=ID)# 根据书籍信息找到人物信息people = book.book_peoples.all()# 返回HTML文件return render(request, "Book/details.html", {"book":book, "people":people})
path('books/', views.show_books, name="show_books"), # 显示图书信息
path('books/<int:ID>', views.details_books, name="details_books"),
- 属性的命名:
(1)不能用python的保留关键字
(2)不允许使用连续的下划线
(3)定义属性时,指明字段类型
(4)属性 = models.字段类型
- 约束字段的选项
(1)null:如果为True表示允许为空,默认值为False,数据库范畴
(2)blank:如果为True,则该字段允许为空白,表单验证范畴
(3)unique:字段唯一性
(4)db_column:字段的名称,若未指定,则为属性名
(5)db-column:若为True,则会为字段创建索引
(6)default:默认值
(7)primary_key:若为True,则该字段为模型的主键字段;若为Fasle,则一般作为AutoField的选项使用
(1)等价于实现SQL语句的where功能,调用
filter(),exclude(),get()
(2)通过属性__运算符
表示外键对应的id值(这里是两个下划线)
(3)两个下划线!!!!!!!!!!
"""通过过滤器filter(),指定对象id获取对象"""alist = BookInfo.objects.filter(id=1)
(1)contains:是否包含
(2)startswith:指定目标对象的开头字符
(3)endswith:指定目标对象的结尾字符
# 查询书名含有‘无’字的书
alist = BookInfo.objects.filter(book_title__contains="无")# 查询书名开头为‘p’的书
alist = BookFnfo.objects.filter(book_title__startswith="p")# 查询书名结尾是‘敌’的书
alist = BookInfo.objects.filter(book_title__endswith='敌')
运算符前面加上
i
则不区分大小写:icontains,istartswith,ienswith
filter()
过滤器"""isnull是否为空"""# 书名不为空的书
alist = BookInfo.objects.filter(book_title__isnull=False)
filter()
"""in 是否在范围内"""# 查询编号为1、3、5的书
alist = BookInfo.objects.filter(id__in=[1, 3, 5])
filter(),exclude()
(1)gt:大于
(2)gte:大于等于
(1)lt:小于
(2)lte:小于等于
# 查询编号大于3的书
alist = BookInfo.objects.filter(id__gt=3)# 查询编号不等于3的书
alist = lude(id=3)
filter()
year,month,day
from datetime import date# 查询1980年的书
alist = BookInfo.objects.filter(book_date__year=1980)# 查询1980.1.1之后的书
alist = BookInfo.objects.filter(book_date__gt=date(1980,1,1))
F(属性名)
from dels import F# 查询阅读量大于评论量的书(两者都是属性,通过F对象转化可以尽心比较)
alist = BookInfo.objects.filter(b_read__gte=F('b_comment'))# 查询阅读量大于2倍评论量的图书
alist = BookInfo.objects.filter(b_read__gt=F('b_comment')*2)
"""多个选项限制"""# 查询阅读量大于20,同时编号小于3的书
alist = BookInfo.objects.filter(b_read__gt=20, id__lt=3)
&,|,~
from dels import Q# 查询阅读量大于20,或者编号小于3的书
alist = BookInfo.objects.filter(Q(b_read__gt=20)|Q(pk__lt=3))# 查询编号不为3的书
alist = BookInfo.objects.filter(~Q(pk=3))
aggregate()
过滤器调用聚合函数(1)Avg:平均
(2)Max:最大
(3)Min:最小
(4)Sum:总和
from dels import Sum# 计算阅读量的总数
alist = BookInfo.objects.aggregate(Sum('b_read')
# 计算图书总数
alist = unt()
(1)all():返回所有数据
(2)filter():过滤器,返回满足条件的数据
(3)exclude():返回条件以外的数据
(4)order_by():对返回的结果进行排序
(5)get():返回单个条件的对象
(6)count():返回查询结果的总数
(7)aggregate():聚合,返回一个字典
(8)exists():判断是否有数据存在
(1)惰性执行:创建查询时不会访问数据库,直到调用数据时才会访问数据库
(2)缓存:第一次执行之后会将数据保存到缓存中,下一次直接从缓存读取
# 对数据库进行了两次查询
book.id for book in BookInfo.objects.all()
book.id for book in BookInfo.objects.all()# 只会对数据库进行一次查询,结果保存到缓存中
alist = BookInfo.objects.all()
book.id for book in alist
……
book.id for book in alist
……
可以对查询集进行切片
alist = BookInfo.objects.all()[0:2]
(1)ForignKey外键: 一对多,将字段定义在多的一端
(2) ManyToManyField: 多对多,字段可以定义在任意一端
(3)OneToOneField: 一对一,字段可以定义在任意一端
{{ 变量 }}
{{ book.title }}
相当于字典 book[‘title’]
{ % 代码 %}
{% if…… %}
{% elif…… %}
{% else %}
- 单行注释:
{#……#}
- 多行注释:
{% comment %}……{% endcomment %}
{% block 模板名称%}
…… {# 预留空白区,可以编写内容也可以不写 #}
{% endblock 模板名称%}
子模板第一行使用
extend
进行继承
{% extend "父模板路径" %}
{% block 模板名称%}
…… {# 实际填充内容 #}
{{ block.super }} {#用于获取父模板中的block内容#}
{% endblock %}
CSRF指攻击者盗用你的身份,以你的名义发送恶意请求
恶意网站拿到了你的 cookie 之后就可以访问你当前浏览的网站服务器
在访问当前网站A时,又访问了攻击网站B,这样B就可以获取到你的cookie信息攻击你当前访问的网站
HTTP协议是无状态的,每一次请求都是一次全新的请求,不保存上一次请求的信息
浏览器和服务器之间是使用Socket套接字通信的,响应返回之后,服务器会关闭当前的Socket连接,而且当服务器处理完请求后也会销毁html页面不会保存
为了保持住登录状态,保存浏览信息,采用客户端存储cookie以及服务器端存储session的方法
(1)cookie 是由服务器端生成,发送给浏览器。
(2)浏览器会将 cookie 的 key/value 保存到某个目录下的文本文件中
(3)下一次请求同一网站时就会将 cookie 也发送给服务器用于认证
(1)cookie是域名安全的,只针对特定网站
(2)cookie 利用键值对(key/value) 保存信息
(3)每一次浏览器请求服务器时,都会将相对应的 cookie 和请求一起发送给服务器
django 中 session 是默认打开的
使用session后,会在cookie中保存一个sessionid 的数据,用于高速服务器找到哪个session
1. Cookie
(1)保存在客户端
(2)存储用户信息
2. Session
(1)保存在服务器端
(2)存储安全性要求较高数据
(3)依赖cookie,在cookie中存储一个sessionid数据用于在服务器端找到目标session
(1)表单登录
(2)Ajax登录
(1)
POST
:所传信息保存在请求首部中,适合安全性较高的数据
(2)GET
:所传信息显示在url中
例如:www.XXX/login? user=XXX && password=XXX
<form>
标签<form>
标签用于为用户输入创建HTMl表单,用于传输数据login.html文件
<!DOCTYPE HTML>
<html lang="en" xmlns="">
<head><meta charset="utf-8"><title>登陆界面</title>
</head>
<body><form method="post" action="/login_submit/">账号:<input ytpe='text' name='username'></br>密码:<input type="password" name="password"></br><input type='submit' value='登录'></form>
</body></html>
无需重新加载,能够动态更新部分页面
例如:当登录密码错误需要重新登陆时,不需要重新加载整个页面,只需要重新加载部分页面即可
# 入门没~~~~~~~~~~~
GitHub地址:
本文发布于:2024-02-01 05:30:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170673663534237.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |