站点和资源django(1)(2)

发布时间 2023-07-19 19:03:32作者: 言行一

搭建web站点及其业务框架

安装django

pip install djangopip 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函数
]
  1. from django.urls import path: 这是导入 Django 中的 path 函数,用于定义URL模式。
  2. 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_detailsubmit_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页面,将动态数据和静态页面内容组合在一起,返回给用户展示。