搭建web站点及其业务框架
安装django
pip install django
或 pip install -i https://mirrors.aliyun.com/pypi/simple django
在安装执行完后,库默认在env目录的site-packages,没有env目录可以在终端执行python -m venv venv
创建web站点
项目名为djangoProj,django-admin startproject myblog
后会发现多出myblog的文件夹以及其自带的几个文件,结构是:
-
项目名(djangoProj)
-
站点名(myblog)
-
核心子模块(也叫myblog)
- init.py asgi.py wsgi.py其中最重要的是settings、urls
-
manage.py
-
-
业务模块
python manage.py startapp travel
python manage.py startapp book
python manage.py startapp data
以此建好三个子模块,分别叫data、travel和book
在核心子模块的setting里找到 INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book', #添加刚创建的业务名称
'data',
'travel'
]
将刚刚建的三个 子模块添加进去
测试web
python manage.py runserver
终端会报出一个地址:[http://127.0.0.1:8000],🚀图标表面请求成功;
访问路由的设定
③ myblog核心子模块里的urls.py全局路由文件:
因为①②把局部已设置完,所以全局的urls写
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book',include('book.urls')) #使用include函数,book.urls为业务模块里的urls包
]
① book里的urls.py局部路由文件:
此处是手动新建一个urls.py,写入:
from django.urls import path #导入路径相关配置
from . import views #导入视图views
urlpatterns = [
path('', views.index,name="index"), #默认访问book业务的首页
]
② book里的views.py视图设置文件:
from django.http import HttpResponse
def index(request):
msg="welcome to visit Dr.Cao's blog,2020!"
return HttpResponse(msg)
以上按①②③顺序完成后打开127.0.0.1:8000/book可见设定内容“welcome to visit...”
在book局部urls引入sell:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index,name="index"),
path('/sell', views.sell,name="sell") #添加一个sell子页面路径,访问views里的sell函数
]
回到book的views,添加sell内容:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
msg="welcome to visit Dr.Cao's blog,2020!"
return HttpResponse(msg)
def sell(request): #增加的sell函数
msg="你在访问曹鉴华的售书页面"
return HttpResponse(msg) #返回字符串变量响应
保存以上后可访问127.0.0.1:8000/book/sell
访问HTML
在全局setting找到TEMPLATES,修改DIRS参数
'DIRS' : [ str(BASE_DIR / "templates") ]
templates的外层html里:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>myblog book</title>
</head>
<body>
<p>欢迎访问曹鉴华博客,本博客将推出系列讲座</p>
<p>{{data}}</p>
</body>
</html>
book的views也要相应变化,修改渲染为render:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
msg="welcome to visit Dr.Cao's blog,2020!"
return HttpResponse(msg)
def sell(request):
msg={} #定义了一个字典
msg['data']="你在访问曹鉴华的售书页面" #设置了键名为data,值为后面的语句
return render(request,'index.html',msg) #使用render渲染方式
超链接和静态资源文件路由
首页的路由
核心子模块添加views.py:
from django.shortcuts import render
from django.http import HttpResponse
def index(request): #定义整个站点视图的index函数
return render(request,'index.html') #z渲染整个站点的index首页
核心子模块的urls全局添加:
from django.contrib import admin
from django.urls import path,include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book',include('book.urls')),
path('',views.index,name='index') #新添加的首页访问路由,设定到首页的views里的index函数
]
首页视图设计
更改之后的首页(外层index.html)内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>myblog站点</title>
<link rel="stylesheet" href="static/css/index.css">
</head>
<body>
<div class="header">
<li>大数据Data</li>
<li>旅行Travel</li>
<li><a href="/book">文章Book</a></li>
</div>
<section>
<img src="static/img/demo.jpg" alt="">
</section>
<div class="footer">
<li>made by Cao Jianhua</li>
<li>Copyright@2020-2025</li>
</div>
</body>
</html>
在上图的css文件内给出以下样式参考:
/*css for index of myblog*/
.header{
height: 60px;
width: 800px;
background: #333;
color: aliceblue;
padding: 10px 20px 0px 20px;
}
li{
display: inline-block;
list-style: none;
margin: 5px 20px;
}
a{
text-decoration: none;
color: #ff9900;
}
.footer{
background: darkgreen;
color: #f90;
font-size: 12px;
}
网页资源文件的访问
资源就是图中statics下的内容,为了访问到此处的资源,回到核心子模块的setting加入:
STATIC_URL = '/static/' #原就存在的设置
STATICFILES_DIRS= [os.path.join(BASE_DIR,'static')] #添加资源文件路径位置
超链接a标签和herf的指引跳转
先将book子模块的网页(子页面)内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>book page</title>
<link rel="stylesheet" href="static/css/index.css">
</head>
<body>
<div class="header">
<li>大数据Data</li>
<li>旅行Travel</li>
<li><a href="book">文章Book</a></li>
</div>
<section>
<p>这是文章页面</p>
<p><a href="/"> 回首页</a></p>
</section>
<div class="footer">
<li>made by Cao Jianhua</li>
<li>Copyright@2020-2025</li>
</div>
</body>
</html>
然后回到book的views,对返回值进行修改,以确保在首页(父页面)点击“book”字样后触发的超链接指向正确的页面(book的子页面)
图中代码如下(book/views.py)
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return render(request,'book/index.html')
def sell(request):
msg = {} # 定义了一个字典
msg['data'] = "你在访问曹鉴华的售书页面"
return render(request, 'index.html', msg)
# index 函数:这个函数用于处理访问 book 主页面的请求。当用户访问 book 主页面时,该函数会渲染 book/index.html 模板并返回给用户。
sell 函数:这个函数用于处理访问 sell 子页面的请求。当用户访问 book/sell 路径时,该函数会渲染 index.html 模板,并将一个包含 'data' 键的字典 msg 传递给模板。在这个例子中,msg['data'] 的值是 "你在访问曹鉴华的售书页面"。
以上就是全部步骤,按效果应该实现 “ 点击book会跳转到子页面 ” 的动作。
总结
其余部分的理解
整体框架的构建
myblog
是核心模块,其中包含项目的配置文件和URL配置。book
是业务模块,其中包含视图函数views.py
用于处理与书籍业务相关的逻辑。static
目录用于存放静态文件,如CSS、JavaScript和图像等。templates
目录包含HTML模板文件,其中index1.html
是主页面模板,而book
目录是用于存放子页面模板的目录,其中index2.html
是子页面的模板。
book业务模块
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name="index"),
path('/sell', views.sell, name="sell") # 添加一个sell子页面路径,访问views里的sell函数
]
from django.urls import path
: 这是导入 Django 中的path
函数,用于定义URL模式。from . import views
: 这是导入当前目录下的views
模块,即views.py
文件。
注意:
-
在
urls.py
中的path()
函数用于映射URL路径和视图函数之间的关系。在这里,空路径
''
会匹配到index
函数,而'/sell'
路径会匹配到sell
函数。 -
在
sell
函数中,使用render()
函数将数据msg
传递给模板。在渲染index.html
模板时,模板中可以通过msg.data
来获取数据值"你在访问曹鉴华的售书页面"
。
以上代码片段定义了 book
业务模块的两个视图函数,分别处理主页面和售书页面的请求,并通过模板渲染将数据传递给相应的模板。
关于TEMPLATES
TEMPLATES
配置项,用于配置模板引擎的设置。'DIRS'选项配置了模板文件的目录,即指定了模板文件所在的路径为项目根目录下的
templates目录。同时,
'APP_DIRS'选项设置为
True,表示Django将自动在所有已安装应用程序的
templates`目录中查找模板文件。这样,我们就可以在模板中直接引用这些应用程序中的模板文件。
数据在文件间的传递
通过URL传递数据(方式之一):
在视图函数中获取这些参数并进行处理。假设我们有一个博客应用,想要显示特定博客文章的详细信息:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('article/<int:article_id>/', views.article_detail, name='article_detail'),
]
什么是视图函数?
视图函数通常定义在
views.py
文件中,上例中,article_detail
和submit_comment
都是视图函数。它们接收请求并根据具体的需求进行相应的处理和操作。这些视图函数可以在views.py
文件中定义,并在URL配置中进行映射,以便在特定的URL上进行调用
在视图函数中,我们接收article_id
参数,并使用它从数据库中检索特定的文章:
# views.py
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_detail(request, article_id):
article = get_object_or_404(Article, pk=article_id)
return render(request, 'article_detail.html', {'article': article})
关于子页面
两个HTML文件是Django中模板文件,用于渲染页面内容。它们通过Django的URL配置和视图函数来实现在业务模块book和核心全局模块myblog之间实现互相跳转。
这是项目的主页面模板,其中包含了一个顶部导航栏和一个底部页脚。在导航栏中有一个链接 <a href="/book">文章Book</a>
,该链接指向业务模块book下的URL配置(/book
)。点击这个链接将会跳转到业务模块book的urls.py
中定义的名为 "index" 的视图函数,即 views.index
。这样实现了从主页面跳转到业务模块book的页面。
这是业务模块book的子页面模板,同样包含一个顶部导航栏和一个底部页脚。在导航栏中有一个链接 <a href="book">文章Book</a>
,这个链接是相对路径,指向了当前目录下的 "book" 子目录。因为在Django中,相对路径是相对于当前URL的,所以这个链接指向了业务模块book的URL配置。点击这个链接将会跳转到业务模块book的urls.py
中定义的名为 "index" 的视图函数,即 views.index
。这样实现了从子页面跳转回业务模块book的主页面。
综合理解
项目结构:
项目结构如下:
csharpCopy codemyblog/ # 核心模块
settings.py # Django项目配置文件
urls.py # 核心URL配置
book/ # 业务模块
views.py # 视图函数定义,处理业务逻辑
static/ # 静态素材目录 (CSS, JS, 图片等)
templates/ # 模板目录
index1.html # 主页面模板
book/ # 子页面模板目录
index2.html # 子页面模板
Django的推荐结构,将不同功能模块拆分成不同的子模块,使得代码更加清晰、模块化、易于维护和扩展。
端口:
在Django中,通过运行开发服务器(python manage.py runserver
),项目将监听默认端口(8000)。
视图函数:
在views.py
文件中定义了两个视图函数 index(request)
和 sell(request)
,它们分别用于处理不同的请求。
index(request)
视图函数用于处理主页的请求,它会将index1.html
模板渲染成HTML页面作为响应返回给浏览器。sell(request)
视图函数用于处理/sell
路径的请求,它会将index.html
模板渲染成HTML页面并返回给用户的浏览器。
Models:
暂时没有进行到models的相关代码。
Models是Django中用于定义数据库模型的部分,用于描述数据结构和关系。在项目中的models.py文件中,定义书籍、用户、文章等数据库表的结构和字段。
模板:
在templates
目录中,有两个HTML模板文件:index1.html
(主页面)和 book/index2.html
(子页面)。模板是用于渲染页面内容的。在视图函数中,通过调用render
函数,可以将这些模板渲染成HTML页面,并返回给浏览器。
关系总结:
-
项目结构定义了代码的组织方式,使得代码分成了不同模块,便于维护。
-
端口是用于在开发服务器上运行Django项目的入口,允许在浏览器中访问项目。
"开发服务器"是一个抽象的概念,指的是一个轻量级的Web服务器,用于在开发环境中运行和测试Django项目,并不是一个具体的页面或文件,而是一个运行在本地的进程
-
视图函数定义了对不同URL路径的处理逻辑,可以根据用户请求返回不同的响应。
在PyCharm中,按住左Ctrl(对于Windows和Linux)或Cmd键(对于Mac),然后单击视图函数名称,可以进行快捷跳转到该视图函数的定义处。
【不仅限于视图函数,任何Python代码中,当你想查看某个函数、变量或类的定义时】
-
Models是用于定义数据库模型,可以在数据库中创建和管理数据。
-
模板用于渲染HTML页面,将动态数据和静态页面内容组合在一起,返回给用户展示。