一个基于Python的高级Web开发框架
浏览器浏览网页端基本原理
本质是网络通信
获取源代码文档(html)
解析文档后以适当形式展现给用户
F12开发者页面
第一章 环境搭建
Django官方地址:http://www.djangoproject.com
pip install Django==3.0.5
查看Django安装版本 python –m django –version
也可以下载源码进行安装
二、 创建项目,并了解项目目录下部分文件端作用
创建项目
创建步骤:
打开命令行,进入想要安置项的目录,输入cmd
命令行输入:django–admin startproject myblog
当前目录生成myblog文件夹
进入Pycharm,打开myblog文件夹
Manage.py
与项目进行交互的命令行工具集入口
执行python manage.py来查看所有命令
启动服务
Python manage.py runserver
打开浏览器查看
127.0.0.1:8000
Localhost:8000
改变端口
Python manage.py runserver 9999
项目Myblog目录
项目的一个容器
包含项目最基本的一些配置
目录名称不建议修改
Wsgi.py
Python web server gateway interface
中文名:pyhton服务器网关接口
Python应用于web服务器之间的接口
Urls.py
URL配置文件
Django项目中所有地址(页面)都需要我们自己去配置其URL
Settings.py
项目的总配置文件,包含数据库、web应用,时间等各种配置
BASE_DIR
项目根目录
# SECURITY WARNING: don't run with debug turned on in production!不要在实际生产中打开(True)
DEBUG = True
1
2
网站bug如果打开debug模式直接错误抛给前端用户
如果关闭,且allowed_hosts有url,通过url访问,前端不显示具体错误,就写找不到
ALLOWED_HOSTS
ALLOWED_HOSTS = [‘localhost’]
ALLOWED_HOSTS默认为空,
如果写入’localhost’,就只允许通过localhost访问,ip不行
如果是127.0.0.1:9999,直接抛出404错误,被屏蔽
INSTALL_APPS应用列表,新增的应用要加入
MIDDLEWARE中间件
ROOT_URLCONF URL根文件
TEMPLATES模板
WSGI_APPLICATION不管
DATABASES数据库配置 默认使用sqlite3
Internationalization国际化
语言时区
Static_url静态文件地址
init_.py 声明模块,有了就可以improt
Debug
三、创建应用
打开cmd,进入项目中manage.py同级目录
输入:
pyhton manage.py statrtapp blog
添加应用名blog到settings.py中的INSTALLED_APPS里
注意:应用名不能与默认模块名相同,如os,math,myblog
应用目录介绍
Migrations
数据移植(迁移)模块,涉及到数据库操作
内容自动生成
Admin.py
该应用的后台管理系统配置,每个应用都有
Apps.py
当前应用的一些配置,django-1.9以后才生成
Models.py
数据模块
使用ORM框架
Test.py
自动化测试模块,提供自动化测试功能
Views.py
执行响应代码所在
代码逻辑处理的主要地点
项目中大部分代码都在这里
四、创建第一个页面(响应)
blog/Views.py添加响应函数
from django.http import HttpResponse
def index(request):
return HttpResponse('hello world')
URLs.py中增加路径
import blog.views as bv
path(rc', bv.index)
浏览器中输入http://127.0.0.1:9999/index/
可以看到调用index函数结果
总结:
1、创建应用
2、编辑blog.views
3、每个响应对应一个函数,函数必须返回一个响应
4、函数必须存在一个参数,一般约定为request
5、每一个响应函数对应一个URL
6、配置URLS.PY
每个URL都以url的形式写出来
url函数放在urlpatterns列表中
url函数三个参数:URL(正则),对应方法,名称
第五章 第一个Template
5-1 配置URL
假如网站太大,直接写在URL文件里难以维护
第二种URL配置
Include方法
在blog页面(响应)下新建urls.py
from . import views as bv
urlpatterns = [
path('admin/', admin.site.urls),
path(r'index/', bv.index),
]
打开根目录下myblog/urls.py,引用include方法
from django.urls import path, include
修改myblog/urls.py中路径为:
path(r'index/', include('blog.urls')),
启动server
浏览器中输入http://127.0.0.1:9999/index/index/可以访问
第一个index是myblog/urls.py里配置的,第二个index是blog/urls.py里配置的
修改myblog/urls.py中路径为:
path(r'blog/', include('blog.urls')) , # 修改为blog与实际响应文件路径一致
修改blog/urls.py中路径为:
path(r'', include('blog.urls')) , # 修改为空3.0.5版本这样就可以了
浏览器中输入http://127.0.0.1:9999/blog/
问题:blog/urls.py中路径设置为空,用所有字符串,都可以访问(3.0.5版本中没有这个问题)
浏览器中输入http://127.0.0.1:9999/blog/afiodjfklaj
修改blog/urls.py中路径为:
path(r’^KaTeX parse error: Expected 'EOF', got '#' at position 28: …blog.urls')) , #̲ 用正则表达式限定空字符串(3…访问
修改blog/urls.py中路径为:
path(r’^index/KaTeX parse error: Expected 'EOF', got '#' at position 28: …blog.urls')) , #̲ 注意要有/ 浏览器中输入ht…才能访问,可能是对正则表达式做了什么限制,以后研究
总结:
在根urls.py 中引入include
在APP目录下创建urls.py文件,格式与根urls.py相同
根urls.py中url函数第二个参数改为include(‘blog.urls’)
注意事项:
根urls.py针对APP配置的URL名称,是该APP所有url的总路径
配置URL时候注意正则表达式结尾符号$和/(3.0.5版本中没有该问题)
5-2 开发第一个Template(模板)
什么是Template
就是HTML文件
使用了django模板语言(django template language,DTL)
可以使用第三方模板(如Jinja2)
Settings.py中,TEMPLATES静态变量
‘BACKEND’修改模板引擎,课程使用默认DTL
步骤:
在APP的根目录(blog)下,创建templates目录
在templates目录下创建html文件
Render用来传递数据到浏览器
在views.py中返回render
from django.shortcuts import render # (渲染)
return render(request, ‘index.html’)
浏览器中输入http://127.0.0.1:9999/blog/
DTL初步使用
Render()函数中支持一个dict类型参数
该字典是后台传递到模板的参数,key为参数名
在模板中使用{{参数名}}来使用
Views.py中
return render(request, ‘index.html’, {‘hello’: ‘hello,blog!’})
index.html中
{{hello}}
浏览器中输入http://127.0.0.1:9999/blog/新建blog2应用
Cmd中 python manage.py startapp blog2
Settings.py中
INSTALLED_APPS添加blog2
把blog中templates文件夹、urls.py复制到blog2
Blog2/templates中index.html中改为hello blog2
Blog里的views.py中的return(去掉render里第三个参数)复制到blog2
def index(request):
return render(request, ‘index.html’)
根myblog目录中urls添加blog2应用路径
path(r’blog2/’, include(‘blog2.urls’)),
启动服务python manage.py runserver(默认8000端口)
浏览器中输入http://127.0.0.1:9999/blog/,正常显示
浏览器中输入http://127.0.0.1:9999/blog2/,旧版仍显示blog内容,新版(3.0.5)显示空白页面
原因
Django查找Template
Django按照INSTALLED_APPS中的添加顺序查找Templates
不同APP下Templates目录中同名的.html文件会造成冲突,不能一个个改
解决Templates冲突方案
在APP的Templates目录下创建以APP名为名称的目录
将html文件放入新创建的目录下
Blog/views.py修改,增加blog文件夹
return render(request, ‘blog/index.html’, {‘hello’: ‘hello,blog!’})
Blog2/views.py修改,增加blog2文件夹
return render(request, ‘blog2/index.html’, {‘hello’: ‘hello,blog!’})
第六章 Models
6-1 Models
Django中的Models是什么
通常,一个models对应数据库中的一张数据表
Django中models以类的形式表现
ORM 对象关系映射(Object relation mapping)
实现了对象和数据库之间的映射
隐藏了数据访问的细节,不需要编写SQL语句
编写Models
步骤:
在应用根目录(blog)下创建models.py,
并引入models模块(新建应用时候就自动创建好了)
创建类,继承models.Model ,该类就是一张数据表
https://docs.jangoproject.com/en/1.10/ref/models/fields/
在类中创建字段
字段就是类里面的属性(变量)
Attr = models.CharField(max_length=64)
Blog/model.py里创建类(数据库)
class Article(models.Model):
title = models.CharField(max_length=32, default='Title')
content = models.TextField(null=True)
模型创建后如何映射成数据表
步骤
Cmd进入manage.py同级目录
执行 python manage.py makemigrations app名称(可选)(该命令为准备)
制作数据迁移,不选名称,默认该项目下所有应用都生成数据迁移
再执行 python manage.py migrate(正式迁移)
迁移的内容很多。包括:
Settings.py 里INSTALL_APPS里django自带应用的数据
查看
Django会自动在app/migrations/目录下生成移植文件
打开0001_initial.py
看到多了一个‘Id’字段,是django自动创建的主键
执行python manage.py sqlmigrate 应用名(blog) 文件id(0001)查看SQL语句
python manage.py sqlmigrate blog 0001
数据库在哪里
默认sqlite3的数据库在项目根目录下db.sqlite3
查看并编辑db.sqlite3
推荐轻量级端第三方软件SQLite Expert Personal
页面呈现数据
后台步骤:
Views.py中
import models
Article = models.Article.objects.get(pk=1) # pk:primary key(id),相当于select id =1
Render(request,page,{‘article’: article})
前端步骤:
模板可直接使用对象及对象的‘.’操作
{{article.title}}
Blog文件夹打开index.html
<h1>{{article.title}}</h1>
<h3>{{article.content}}</h3>
第七章 admin
什么是Admin,Django自带的自动化数据管理界面
被授权的用户可以直接在Admin中管理数据库
配置Admin
Settings.py中INSTALL_APPS第一个应用就是admin
只需要创建超级用户
Cmd 输入python manage.py createsuperuser
输入用户名,email,密码(至少8位)
Admin入口 localhost:8000/admin/(记得先打开服务器)
项目根目录中urls默认设置 的admin访问路径
path(‘admin/’, admin.site.urls),
界面语言修改:
Settings.py中Language_CODE = ‘zh-hans’ # zh_Hans会报错,zh-hans简体,zh-hant繁体
配置应用
在应用下admin.py中引入自身的models模块(或里面的模块类)
编辑admin.py
from blog.models import Article
admin.site.register(Article)
浏览器输入http://127.0.0.1:8000/admin/
进入article
增加article,重名都显示类对象的名称
修改模型类打印的字段
修改步骤
在article类下添加一个方法
根据python选择__str__(self) 或 _unicode(self)
def __str__(self):
return self.title
第八章 完善博客
8-1 博客主页面开发
博客页面设计
页面概要
主页、内容页、撰写页
主页内容:
文章标题列表,超链接
发表博客按钮(超链接)
列表编写思路
取出数据库中所有文章对象
将文章对象们打包成列表,传递到前端
前端页面吧文章以标题超链接的形式逐个列出
模板for循环
{% for xx in xxs %}
Html语句
{% end for %}
注意:之前在模板中调用对象,用{{数据}}
循环是用{% %}
后台修改:
Views.py
articles = models.Article.objects.all() # 获取所有对象
return render(request, ‘blog/index.html’, {‘articles’: articles})
前端页面:
Index.html
<h1>
<a href="">新文章</a>
</h1>
{% for article in articles %}
<a href="">{{article.title}}</a>
<br>
{% end for %}
8-2 博客文章页面开发
页面内容
标题
文章内容
修改文章按钮(超链接)
Views中创建响应函数
def article_page(request, article_id):
article = models.Article.object.get(pk=article_id)
return render(request, 'blog/article_page.html', {'article': article})
templates前端增加页面
article_page.html
<h1>{{article.title}}</h1>
<br/>
<h3>{{article.content}}</h3>
<br/><br/>
<a href="">修改文章</a>
url配置环节
响应函数多了一个参数,要在url里体现出来
path(r’article/(?P<article_id>)[0-9]+’, bv.article_page),
正则表达式匹配到的数字以article_id作为组名去匹配,必须与响应函数里的参数名一致
Django3.0.0版本中,要用re_path
from django.urls import path, include, re_path
urlpatterns = [
re_path(r'^article/(?P<article_id>[0-9]+)$', article_page)]
注意:1、Django3.0.5版本中,要用re_path
2、正则表达式写法
3、引用对象objects
8-3 django模板中的超链接配置
超链接目标地址
Herf后面是目标地址
Template中可以用{% url ‘app_name:url_name’ param%}
其中app_name和url_name都在url中配置
再配URL
url函数的名称参数
根urls,写在include(),的第二个参数位置,namespace = ‘blog’
应用urls,写在url()的第三个参数位置,’name = ‘article’
主要取决于是否使用include引用另一个URL配置文件
Myblog/urls.py中
path(r’blog/’, include(‘blog.urls’, namespace=‘blog’)),
注意:django3.0.5版本中,include第一个参数是一个二维数组,应写为:
path(r’blog/’, include((‘blog.urls’, ‘blog’), namespace=‘blog’)),
blog/urls.py
re_path(r’^article/(?P<article_id>[0-9]+)$’, bv.article_page, name=‘article_page’)
修改blog/templates/blog/article_page.html
8-4 博客撰写页面开发(一)
页面内容
标题编辑栏
文章内容编辑区域
提交按钮
前端编辑
新建edit_page.html文件
后端编辑
注意:包含2个响应函数,页面本身的,和表单form的
Vies.py
def edit_page(request):
return render(request, ‘blog/edit_page.html’)
blog/urls.py添加url
re_path(r’^edit/$’, bv.edit_page)
浏览器输入:http://127.0.0.1:8000/blog/edit/
表单响应函数
使用request.POST[‘参数名’]获取表单数据,post存放前端传过来的数据
放在models中
Models.Article.objects.create(title, content)创建表单对象
Views.py
def edit_action(request):
title = request.POST.get(‘title’, ‘TITLE’)
content = request.POST.get(‘content’, ‘CONTENT’)
models.Article.objects.create(title=title, content=content) # 根据前端回传建立表格
articles = models.Article.objects.all()
return render(request, ‘blog/index.html’, {‘articles’: articles})
blog/urls.py添加url
re_path(r’^edit/
′
,
b
v
.
e
d
i
t
p
a
g
e
,
n
a
m
e
=
′
e
d
i
t
p
a
g
e
′
)
,
r
e
p
a
t
h
(
r
′
e
d
i
t
/
a
c
t
i
o
n
s
/
', bv.edit_page, name='edit_page'), re_path(r'^edit/actions/
′,bv.editpage,name=′editpage′),repath(r′edit/actions/’, bv.edit_action, name=‘edit_action’)
CSRF验证失败. 请求被中断.
安全问题,所有通过post方法提交表单,都 必须在前端加
{% csrf_token %} 防止跨站请求伪造,放在标签里
注意,index.html文件中,超链接地址要补充如下,否则首页上所有链接,都默认为新建一个新文章
新文章
{% for article in articles %} {{article.title}}{% endfor %}
8-5 博客撰写页面开发(二)
修改文章
打开的页面里要有原来的内容,新建文章只要有2个空白框
修改文章页面里有文章对象
有文章的ID
新建文章的ID改成0
Blog/views.py修改edit_page响应,如果id为0,则为新文章,直接返回新建页面
其他返回修改文章页面(还没有添加原文章)
def edit_page(request, article_id):
if str(article_id) == ‘0’:
return render(request, ‘blog/edit_page.html’)
else:
article = models.Article.objects.get(pk=article_id)
return render(request, ‘blog/edit_page.html’, {‘article’: article})
urls.py
re_path(r’^edit/(?P<article_id>[0-9]+)$’, bv.edit_page, name=‘edit_page’), # 修改原有文章,要传入文章id
article_page中,修改文章的链接要改
修改文章
Index.html中,新建文章传id为0
新文章
注意,可能因为缓存问题打不开,关闭页面后重新开
修改文章填入原始文章内容
Edit_page.html
{% if article%} # 条件判断是是否已存在文章
{% else %}
{% endif %}
Edit_action仍然可以通过传递id的方法来做
另一种方法:同样是传id到后台,但不需要再修改url和响应函数的参数
Article的id放在隐藏标签里
Edit_page.html
{% if article%} # 条件判断是是否已存在文章
{% else %}
修改后台响应函数
def edit_action(request):
title = request.POST.get(‘title’, ‘TITLE’)
content = request.POST.get(‘content’, ‘CONTENT’)
article_id = request.POST.get(‘article_id’, ‘0’) # 后一个参数,默认为0
if article_id == ‘0’:
models.Article.objects.create(title=title, content=content) # 根据前端回传建立表格
articles = models.Article.objects.all()
return render(request, 'blog/index.html', {'articles': articles}) # 返回主页
else:
article = models.Article.objects.get(pk=article_id) # 获取页面上的id
article.title = title
article.content = content
article.save()
return render(request, 'blog/article_page.html', {'article': article})
9-1 templates过滤器
什么是过滤器
写在模板中,属于django模板语言
可以修改模板中的变量,从而显示不同的内容
怎么使用过滤器
{{value|filter}}
例子:{{list_names|lenth}} 过滤器显示list长度
过滤器可以叠加:{{value|filter1|filter2|…}}
Edit_page.html
If else条件语句后续不便维护
使用过滤器简化代码
Else里删除,if else endif都删除
Django遇到没有定义的变量,不会报错,只会赋给空值(空字符串)
如果传递空值(非number),会报错:
Field ‘id’ expected a number but got ‘’.
Edit_page.htm修改l
<input type=“hidden” name=“article_id” value={{article.id | default:‘0’}}>
过滤器加入默认数值
更多django 内建过滤器可以继续研究
9-2 shell
什么是django shell
一个python的交互式命令行程序
自动引入了我们的项目环境
可以使用它与我们的项目进行交互
如何使用Django shell
Cmd中输入:Python manage.py shell
From blog.models import Article
Article.objects.all() # 打印所有文章列表
有什么用
进行一些调试工作
测试未知方法
例子:
Article.objects.all().values() # 测试values返回值
9-3 Admin增强
开启runserver
浏览器进入http://127.0.0.1:8000/admin/
进入article
Article添加了一个方法,显示标题
(一)要做多列怎么弄?
Admin.py
admin.site.register(Article)
改变Article注册方式
1、 创建admin配置类
Class ArticleAdmin(admin.ModelAdmin)
注册:admin.site.register(Article,ArticleAdmin) #把父类和配置类绑定
2、 显示其他字段
在配置类中加属性
List_display =(‘title’, ‘content’)
List_display 同时支持tuple和list
(二)添加发布日期
Class Article添加属性
Pub_time = models.DateTimeField(auto_now=True)# 创建对象同时自动设置当前时间
执行数据移植
Cmd:python manage.py makemigrations
Python manage.py migrate
Admin.py
class ArticleAdmin(admin.ModelAdmin):
list_display = (‘title’, ‘content’, ‘pub_time’)
(三)admin.py修改时间
Pub_time = models.DateTimeField(null=True)
重新执行数据移植
Cmd:python manage.py makemigrations
Python manage.py migrate
进入文章,可以修改文章发布时间了
(四)过滤器
Admin.py 中Class ArticleAdmin(admin.ModelAdmin)添加
list_filter = (‘pub_time’,)
tuple只有一个值,也要加逗号
就显示出来根据发布时间过滤的功能
10-1 课程总结
课前准备
开发环境搭建
创建项目及应用
创建项目
创建应用
创建响应页面
第一个templates
重新配置URL
介绍template
开发第一个template
Models
介绍models
编写博客的model
将数据呈现在页面上
Admin
创建超级用户
配置admin
使用
完善博客
博客主页面
内容页面
编辑页面
补充内容
Templates过滤器
Shell
Admin增强