PythonWeb开发——Django(博客系统实例)

16 篇文章 5 订阅
订阅专栏


Django:用 Python语言编写的 开源Web框架,可以轻松地完成一个功能齐全的 Web开发

1.设计模式

1.MVC模式

MVC是一种使用MVC(Model View Controller 模型-视图-控制器)设计创建Web应用程序的模式:

  • Model(模型)表示应用程序核心(比如数据库记录列表)。
  • View(视图)显示数据(数据库记录)。
  • Controller(控制器)处理输入(写入数据库记录)。
    MVC模式
2.Django MTV 模式

对于Django,它有另一套差不多的模式:MTV模式

  • Model 模型:用来构建和操作Web应用中的数据。
  • View 视图:负责接受用户请求,进行业务处理,并返回响应。
  • Template 模板:负责封装响应结果,生成并返回想要的界面。

MTV模式

2.Django项目

1.Django常用命令

Django项目流程
在命令提示符(cmd)中输入命令行django-admin可查看常用命令。

  • 创建Django项目:startproject
  • 创建Django应用:startapp
  • 运行Django项目:runserver
  • 进入shell项目环境:shell
  • 创建迁移文件:makemigrations
  • 执行迁移文件:migrate
2.创建Django项目

在命令提示符输入命令行:django-admin startproject xxxxxx是你想要创建的项目名。例如:
在这里插入图片描述

3.Django项目目录结构

创建完成之后的Django项目目录结构应该如下图所示:
Django项目目录

目录与文件说明
init.py空文件,表示当前目录是一个包
setting.py整个项目的配置文件
urls.py项目的URL配置文件(路由配置),用于配置用户请求的URL与View模块中函数的对应关系
wsgi.py项目与支持WSGI协议的Web服务器对接的入口文件
manage.py项目的入口文件
4.启动开发服务器

进入项目文件夹,输入命令:python manage.py runserver,然后在浏览器的地址栏输入http://127.0.0.1:8000/,如果看到下面这个页面说明Django项目运行成功
Django项目启动

3.Django应用

1.创建应用

每一个项目可划分为若干个子模块,一个子模块可视为一个应用app。创建Django应用的命令:python manage.py startapp xxx,其中xxx就是你想要创建的应用名,例如:
创建Django应用
创建blog应用之后,项目目录变为:
创建blog应用之后的项目目录

其中,db.sqlite3是在项目测试运行(runserver)时生成的一个默认的后台连接的数据库,目录下的blog文件夹就是刚生成的新的应用。注意,用命令提示符cmd生成项目及应用的时候Template模板文件需要自己创建,用Pycharm中的终端进行创建时会自动生成。

下面对生成的应用blog进行某些目录分析:

目录与文件说明
models.pyModel模型,用来构建和操作Web应用中的数据
Views.pyView视图,负责接受用户请求,进行业务处理,并返回响应
admin.pyDjango自带的后台管理工具
2.添加应用blog

创建应用完成之后要在settings.py中添加应用,如下图位置:
在settings.py中添加应用
需要注意的是在'bolg'后面别忘了加,以便下次新增应用。

3.Django显示HelloWorld

要想输出HelloWorld需要在views.py中自定义一个函数用来输出。
views.py

from django.shortcuts import render
from django.http import HttpResponse

def Hello(request):
    return HttpResponse('Hello World')

接着需要配置URL(即打开浏览器在地址栏输入什么URL才会调用HelloWorld函数):
urls.py:

from django.contrib import admin
from django.urls import path,include
from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/hello/',views.hello),
]

配置好之后,在终端输入命令:python manage.py runserver开启服务器,然后到浏览器地址输入http://127.0.0.1:8000/blog/hello/,成功的页面如下所示:
输出helloworld

这里需要考虑另一个很重要的问题就是:当URL出现过多或者app中出现同名函数造成路由混乱了怎么办?为了解决这个问题,可以将路由分解为项目路由,应用路由。改进如下:

blog_yyz下的urls.py(项目路由):

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
]

blog下的urls.py(需要自己新建,应用路由):

from django.urls import path,include
from blog import views

urlpatterns={
    path('hello/',views.hello)
}

实际的地址http://127.0.0.1:8000/blog/hello/由上面两部分路由共同组成。

4.模板系统

在上面HelloWorld的例子中,返回的仅仅是一个字符串,但是在实际项目中返回的应该是一个页面,也就是模板T,里面可以对数据进行动态的渲染。Django模板语言DTL带有特殊语法的HTML文件,可以传递View视图中的参数,实现数据动态化。
渲染模板(传递参数):

from django.shortcuts import render

def index(request):
    return render('request','xxx.html',{字典传递参数})
1.配置views.py
from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
    return HttpResponse('Hello World')
def index(request):
    return render(request,'index.html')
2.配置路由

blog下的urls.py

from django.urls import path,include
from blog import views

urlpatterns={
    path('hello/',views.hello),
    path('index/',views.index)
}
3.实现效果

在浏览器地址栏中输入地址http://127.0.0.1:8000/blog/index/即可访问到以下页面:
模板系统实现效果

5.模型层

Django中的一个模型类就对应着数据库中的一张数据表,对模型类的操作就是对数据库表的操作。引入模型层的原因就是:因为数据库存在多样性,因此如果同一个程序要连接管理不同的数据库,语法会有差异,引入模型类就能实现统一的管理,大大方便了我们对数据库的操作。
Django模型层

1.数据库配置settings.py

settings.py中的DATABASES字段配置了项目所用到的数据库,如下图:
DATABASES
在本次的实验项目中,可以看到用的数据库是db.sqlite3(本地的轻量级数据库),也就是默认的后台数据库,一开始运行项目时所生成的那个文件。

2.博客文章格式分析

博客文章大概可分为四部分文章标题,文章摘要,文章内容,文章ID
博客文章格式分析

3.编写models.py

models.py中的一个就对应数据库中的一张表,类中的一个对象就对应数据库表中的一个字段

from django.db import models

class Article(models.Model):
    article_id=models.AutoField(primary_key=True)
    title=models.TextField()
    abstract=models.TextField()
    content=models.TextField()
4.生成并执行迁移文件

生成迁移文件
编写完models.py之后,要想在数据库db.sqlite3中生成对象的表和字段,需要生成迁移文件并执行,迁移的目的是通过Django的ORM系统将定义在模型类中的字段转换成对应的SQL语句。执行命令为:python manage.py makemigrations,执行完之后会在migrations目录下增加0001_initial.py文件。
执行命令生成迁移文件
执行迁移文件
执行迁移文件数据库生成相应数据库表与字段,执行命令为:python manage.py migrate
执行迁移文件
执行完之后,接下去就是验证是否生成了对应的数据库的表及各字段,需要用到软件:Navicat Premium
Navicat Premium
在软件内建立与sqlite的连接,选择本地文件(就是Django博客项目下的db.sqlite3文件),用户名为root不需要输入密码,打开数据库查找到blog_article这张表即可看到对应的四个字段已经生成。如下图:
建立与sqlite的连接
检验是否成功生成

6.Django Shell

交互式的编程方式,类似与python shell。继承Django环境,可临时性操作和小范围的Debug。不需要运行整个项目来测试。
命令:python manage.py shell
实例:使用Django shell创建博客文章。

7.关于数据库sqlite的一些操作

1.插入操作
  1. 实例化对象
  2. 字段赋值
  3. 对象.save()方法保存

首先在命令行输入python manage.py shell
进入Django shell 模式
接着依次输入以下几条命令创建一个实例化对象

from blog.models import Article
a=Article()
a.title='随笔'
a.abstract='笔记'
a.content='......'
a.save()

如下图:
创建实例化对象
接着去Navicat Premium中对blog_article这张表进行刷新可以看到数据已经添加成功了:
插入数据成功

2.查询操作
  1. get方法:查询一条记录(有多条或没有记录会出错)
  2. all方法:获取所有数据
    例如,在上述例子中,在命令行输入articles=Article.objects.all(),接着利用for循环打印输出信息,如下图(这里我只存了一条信息,如果表中存了多条数据打印出来的就是全部文章的标题title):
    all方法获取所有数据
  3. filter方法:根据条件查询
3.更新操作
  1. get方法找到对象
  2. 给字段更新数据
  3. 对象.save()方法保存
4.删除操作

对象.delete()

8.动态数据页面

能够将数据库sqlite中的数据打印输出了之后,现在就需要将数据渲染到一个动态的数据页面index.html上去,达到最终目的。
静态页面index.html来自于 Bootstrap,部分代码如下图:
静态页面index.html
Django模板语法

{% for ... in ...%}
...
{% endfor %}
{% if %}
...
{% elif %}
...
{% else %}
{% 变量 %}

采用Django模板语言(DTL)改写之后:
index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的第一个Django Web项目</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div class="container page-header">
    <h1>第一个Django项目-极简博客
    <small>--by yyz</small>
    </h1>
</div>
<div class="container page-body">
    <div class="col-md-9" role="main">
        <div class="body-main">
            <div>
                {% for article in articles %}
                    <h2>{{article.title}}</h2>
                    <p>
                    {{article.content}}
                    </p>
                {% endfor %}
            </div>
        </div>

    </div>
    <div class="col-md -3" role="complementary">
        <div>
            <h2>最新文章</h2>
            {% for article in articles %}
                <h4><a href="#">{{article.title}}</a></h4>
            {% endfor %}
        </div>
    </div>
</div>

</body>
</html>

views.py也需要改写(将index.html中的循环变量articles做为参数传过去):

from django.shortcuts import render
from django.http import HttpResponse
from blog.models import Article

def hello(request):
    return HttpResponse('Hello World')
def index(request):
    articles=Article.objects.all()
    return render(request,'index.html',{'articles':articles})

最终实现效果(这里因为数据库只有一篇文章显得很不美观):
最终实现效果

9.博客详情页面detail.html

用Django模板语法先对detail.html进行改写:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的第一个Django Web项目</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div class="container page-header">
    <h1>{{ curr_article.title }}
    </h1>
</div>
<div class="container body-main">
            <div>
                <p>
                    {{ curr_article.content }}
                </p>
            </div>
            <div>
                <nav aria-label="...">
                  <ul class="pager">
                    <li><a href="/blog/detail/{{ p_article.article_id}}">上一篇:{{ p_article.title }}</a></li>
                    <li><a href="/blog/detail/{{ n_article.article_id}}">下一篇:{{ n_article.title }}</a></li>
                  </ul>
                </nav>
            </div>
</div>
</body>
</html>

接着编写视图函数views.py中的对应detail方法:

def get_detail_page(request):
	curr_article=Article.objects.all()[0] #[0]表示拿到第一篇文章
	return render(request,'detail.html',{
	'curr_article':curr_article #curr_article就是你想要查看详细内容的那篇文章
})

当然还需要配置URL:
应用路由blog下的urls.py添加一条路由(项目路由不需要配置):

path('detail/',views.get_detail_page),

接着在浏览器地址栏中输入:http://127.0.0.1:8000/blog/detail就能访问到第一篇文章的详情页面了。
当然,这种做法每次需要在代码输入指定的文章下标[]才能去进行访问,显然是不科学的,最好的方法就是在浏览器地址栏中直接输入对应文章的id就能访问到指定文章的详情页面,就比如输入http://127.0.0.1:8000/blog/detail/1,就能访问到第二篇文章。
所以就需要更改一下路由配置urls.py

path('detail/<int:article_id>',views.get_detail_page),

对应的视图函数views.py

def get_detail_page(request,article_id):
	all_article=Article.objects.all()
	for article in all_article:
		if article.article_id==article_id:
            curr_article=article
            break
	return render(request,'detail.html',{
	'curr_article':curr_article #curr_article就是你想要查看详细内容的那篇文章
})

这样就实现了在地址栏可以输入http://127.0.0.1:8000/blog/detail/下标来访问对应下标的文章详情页面。

10.文章列表页index.html与详情页detail.html相关联

想要实现在文章列表中点击对应的文章超链接或标题可以跳转到指定文章的详情页面。
index.html

<div>
    {% for article in articles %}
        <h2><a href="/blog/detail/{{ article.article_id }}" >{{article.title}}</a></h2>
        <p>
        {{article.content}}
        </p>
    {% endfor %}
</div>
...
<div>
   <h2>最新文章</h2>
   {% for article in articles %}
   	   <h4><a href="/blog/detail/{{ article.article_id }}">{{article.title}}</a></h4>
   {% endfor %}
</div>
...

但是详情页面又显得非常单调,除了标题和内容就没其他元素了。可以在详情页面加上一组按钮,用来实现跳转上一篇或者下一篇的功能。
Bootstrap 翻页功能组件
翻页功能代码
detail.html
当然这里另外需要增加显示的是在上一篇下一篇按钮处显示对应上一篇或者下一篇文章的题目

<div>
    <p>
        {{ curr_article.content }}
    </p>
</div>
<div>
    <nav aria-label="...">
      <ul class="pager">
        <li><a href="/blog/detail/{{ p_article.article_id}}">上一篇:{{ p_article.title }}</a></li>
        <li><a href="/blog/detail/{{ n_article.article_id}}">下一篇:{{ n_article.title }}</a></li>
      </ul>
    </nav>
</div>

接着就需要在views.py中找到上一篇和下一篇文章并传过来,具体思路就是先要找到当前这篇文章的下标索引值index,那么它的上一篇文章的下标就是index-1,下一篇文章的下标就是index+1,当然当当前文章是第一篇时,它是没有上一篇的;当前文章是最后一篇时,它是没有下一篇的。

def get_detail_page(request,article_id):
    all_article=Article.objects.all()
    p_index=0 #前一篇文章的下标
    n_index=0 #后一篇文章的下标
    for index,article in enumerate(all_article): #enumerate函数的作用是为迭代对象添加索引,索引下标从0开始
        if index==0: #当前文章是第一篇
            p_index = 0
            n_index = index+1
        elif index==len(all_article)-1: #当前文章是最后一篇
            p_index = index-1
            n_index = index
        else:
            p_index = index-1
            n_index = index + 1
        if article.article_id==article_id:
            curr_article=article
            p_article=all_article[p_index]
            n_article = all_article[n_index]
            break
    return render(request,'detail.html',{'curr_article':curr_article,'p_article':p_article,'n_article':n_article})

完成之后的效果如下图:
详情页面可以进行翻页操作

11.对详情页面进行分页

还是一样去刚才的Bootstrap复制分页的html代码,并把它放到index.html中。
Bootstrap上的默认分页的代码

<div>
    <nav aria-label="Page navigation">
      <ul class="pagination">
        <li>
          <a href="/blog/index?page={{previous_page}}" aria-label="Previous">
            <span aria-hidden="true">&laquo;</span>
          </a>
        </li>
          <% for num in page_num%>
        <li><a href="/blog/index?page={{num}}">{{num}}</a></li>
          {% endfor %}
        <li>
          <a href="/blog/index?page={{next_page}}" aria-label="Next">
            <span aria-hidden="true">&raquo;</span>
          </a>
        </li>
      </ul>
    </nav>
</div>

目前在网页上常见的浏览不同页面的方法就是在地址栏中输入http://127.0.0.1:8000/blog/index?page=1,通过获取到地址栏的中page参数的值来显示对应的页面。语句为:

page=int(request.GET.get('page')) #获取到的page是字符串类型的,需要进行转换。

具体的分页需要用到Django的一个模块:Paginator。具体代码及函数如下:

from django.core.paginator import Paginator as pr

def index(request):
    page=request.GET.get('page')
    if page: #这里代码的目的是为了防止第一次输入时地址出错就默认跳转到第一页
        page=int(page)
    else:
        page=page
    all_articles = Article.objects.all()
    paginator=pr(all_articles,3) #每一页三篇文章
    page_num=paginator.num_pages #总页数
    page_article_list=paginator.page(page)
    if page_article_list.has_next(): #has_next():是否有下一页
        next_page = page + 1
    else:
        next_page = page + 1
    if page_article_list.has_previous(): #has_previous():是否有上一页
        previous_page = page - 1
    else:
        previous_page = page
    return render(request,'index.html',{
        'articles':page_article_list,
        'curr_page':page, #当前页
        'previous_page':previous_page, #上一页
        'next_page':next_page, #下一页
        'page_num':range(1,page_num+1), #各个页码的列表
    })

最终实现的效果如下图:
添加分页之后的导航页面

12.Django Admin 模块

Django Admin 模块是Django自带的的后台管理工具,可读取模型数据,提供强大的管理使用页面。
创建admin用户:python manage.py createsuperuser,然后输入我们的用户名和密码:
创建admin用户
后台管理的URL是http://127.0.0.1:8000/admin,不需要我们手动配置,直接可以访问。

在访问时,如果出现TypeError: 'set' object is not reversible的报错,报错的原因是“设置”对象不可逆。只需要将urls.py中的urlpatterns改为[]而不是{}即可。

访问成功的页面如下:
admin后台管理系统页面
输入自己刚才设置的用户名和密码进行登录:
登录成功页面
注册模型之后的管理页面
第一次登录是是看不到BLOG下的Articles的,这时候需要在admin.py中注册模型

from blog.models import Article
admin.site.register(Article)

如果想要设置语言为中文,可以在settings.py中修改:
settings.py设置语言及时区
LANGUAGE_CODE是设置语言环境TIME_ZONE设置时区

LANGUAGE_CODE = 'zh-Hans' #修改语言为中文
TIME_ZONE = 'Asia/Shanghai' #修改时区
# Python和Django的版本问题,可能会导致退出服务

13.Django运用MySql数据库

Django的MTV模式中的的模型model采用的是ORM模型的方式:对象关系映射,通过类的方法操作数据库,不再写原生的SQL语句,把表映射成类,把行作实例,把字段作属性。(Django在操作数据库时可以忽视数据库的类型,仅仅是操作某个类就可以实现对数据库中表,字段的操作)。这种模式的优点就是:性能损耗小,设计灵活,可移植性(轻松切换数据库)

1.创建数据库

可以在MySql中直接创建,也可以用Navicat连接到MySql并创建。
在连接上右键选择新建数据库:
新建数据库

2.配置数据库连接

创建好了之后就需要在seetings.py配置数据库连接
seetings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'blogdb',
        'USER':'root',
        'PASSWORD':'182584',
        'HOST':'127.0.0.1',
        'PORT':'3306'
    }
}

即便是这样配置好了,项目还是无法执行,因为对应的迁移文件还没有创建。并且,Django操作Mysql数据库需要一个驱动程序—pymysql库,首先先下载pymysql第三方库。然后,在整个项目的_init_.py中添加如下代码:

import pymysql

pymysql.version_info = (1, 3, 13, "final", 0) //这句话是为了解决Django3与pymysql不兼容的问题
pymysql.install_as_MySQLdb()
3.创建迁移文件并执行

创建迁移文件之前,需要将之前sqlite的迁移文件删除掉,即下图中的0001_initial.py
在这里插入图片描述
然后执行命令python manage.py makemigrations来创建迁移文件:
创建迁移文件
执行python manage.py migrate来执行迁移文件(看到一连串的OK就说明执行成功了):
执行迁移文件
可以看到Mysql中的blogdb数据库中已经多了一张表blog_article
生成表blog_article
这个时候再去启动项目服务可以看到在地址http://127.0.0.1:8000/blog/index/?page=1中已经出现页面,但是还没有数据显示,因为我们压根没有往表中添加数据:
项目启动成功

4.给空数据表中添加数据

可以选择执行sql文件或者手动添加数据,数据添加完了之后刷新页面就有文章可见了:
添加数据之后的blog页面

5.模板路径的设置

在视图函数views.py中,每个函数都有一句返回语句:

from django.shortcuts import render
...
def index(request):
...
return render(request,'index.html',{字典传递参数})

像上图中的index.html,写的时候并没有指定具体的路径,仅仅是写了文件名,并且index.html这些html文件都放在blog/templates(应用/模板)下。其中的原因就是在seetings.py文件中:
seetings.py中的TEMPLATES模板设置
'DIRS':[]:(如果你想执行html文件)到指定路径下查找。
APP_DIRS:True:到app(视图函数对应的app)的templates目录下查找。
先按DIRS找,然后找已安装的app的templates目录,再找其他app(选择有先后次序)。当然在seetings.py中已经添加了应用blog
在settings.py中已经添加了应用blog
所以在render的参数中,index.html不需要再加什么路径,它会自己找到所在app下的templates中去寻找。当然,如果index.html并不是直接放在templates目录下,而是放在templates/aa文件夹下,那么在render中的路径就要改为aa/index.html,否则就会报错了。

如果有多个应用同时使用到模板文件,比如index.html,那么这些模板文件都可以放到整个项目的templates文件夹(自己新建)下,在所有的应用中的视图函数views.py都可以方便使用。如果templates放到了整个项目文件夹下,需要进行配置才可以使用。配置方法如下:
settings.py中配置:

'DIRS': [os.path.join(BASE_DIR,'templates')]

BASE_DIR在项目中原本就有配置,就是整个项目的路径:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

14.静态文件

1.定义

一个网页中,除了html骨架外,还有css样式文件,js执行文件,以及图片等文件。

2.加载方法
  • 确保django.contrib.staticfiles已经添加到应用。
    django.contrib.staticfiles添加到应用
  • 确保settings.py中设置了STATIC_URL。
    settings.py中设置了STATIC_URL
  • 把静态文件放在static文件夹下(应用,项目)。具体文件夹建立在哪里就看静态文件用在某个应用下还是多个应用都会用到。
    应用:blog/static/blog
    项目:STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]
3.具体实现

如下图在应用blog文件夹下新建一个文件夹static,将静态文件(图片等)放到里面。
在应用下面新建一个static文件夹
为了避免与原index.html混淆,新建一个index2.html,然后写入以下代码:

{% load static %} #load标签加载静态文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <img src="{% static '20190309160339403.gif' %}" alt=""> #这里只需要写文件名,因为在settings.py中已经设置了应用静态文件的路径为blog/static
</body>
</html>

因为有了一个新的页面,因此还需要配置视图函数,在之前的hello视图函数的基础上改写:

def hello(request):
    return render(request,'index2.html')

在地址栏中输入:http://127.0.0.1:8000/blog/hello/就可以访问到添加了静态页面之后的页面:
添加了静态文件的页面

当有多个应用在使用静态文件的时候,假如两张图片重名了,那么为了避免寻找出错,我们需要在每个应用的static文件夹下再新建一个和应用同名的文件夹static文件夹下再新建一个和应用同名的文件夹
然后在页面index2.html中将文件名改成地址+文件名:<img src="{% static 'blog/20190309160339403.gif' %}" alt="">,这样就可以避免应用静态文件重名的问题。

同样的,如果静态文件是多个应用会用到的,那么就在整个项目文件夹下新建一个static文件夹,然后放入静态文件,在settings.py中写入语句:STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]index2.html中img的src只需要写一个文件名就可以了。

Django(博客系统实例)到此结束!!!

python django web开发示例
longzhuliuhe的专栏
04-01 719
1.创建app 选中项目名右击---django---create application 输入名称product 2.修改settings.py 在installed_apps中添加product INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'djang...
python Djangoweb开发实例(入门)
09-18
主要介绍了python Djangoweb开发实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
基于python框架django实现的个人博客管理系统包含前端+后台
06-29
基于python框架django实现的个人博客管理系统包含前端+后台 运行环境 django1.10+python3+sublime text3+Navicat Premium+cmd命令 项目技术 django+python+sql+cmd+html+css+jquery 使用分页插件,jquery实现万年历,实现时间自动同步更新,调用QQAPI会话面板,前后端分离,后台对数据的增删查改,对用户增删查改,对用户权限赋予等等。 数据库文件sqlite文件—db.sqlite3,数据库名dfyblog 账户密码: admin+password123
Python web开发框架Django小例子
12-06
Python web开发框架Django小例子
基于Django的个人博客系统
最新发布
2401_86118737的博客
09-06 427
系统拥有管理员和博主两个角色,主要具备注册登录、个人信息修改、博主、博客文章、博文排行管理、博文打赏、博文归档、留言板、博文分享等功能模块。开发技术:Python django mysql。系统包含源码➕数据库➕文档(仑文 PPT)。基于Django的个人博客系统
Django项目完整搭建流程(简单的用户名及登录密码提交入库后展示)
bensam的博客
10-29 4793
原文转载自:http://www.cnblogs.com/Leo_wl/p/5824541.html 一、Django简介   百度百科:开放源代码的Web应用框架,由Python语言编写……   重点:一个大而全的框架,啥都替你考虑好了。 1. web框架介绍   具体介绍Django之前,必须先介绍WEB框架等概念。   web框架: 别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。   一般web框架的架构是这样的:   其它基于.
python Django 搭建简单的个人博客网站(一)
热门推荐
wangzhanxidian的博客
06-27 1万+
一.Django框架的作用 Django框架负责处理大部分web开发底层细节,如负责底层Http协议的解析,可以让我们专注于开发web应用,避免重复工作 二.Django框架的优势 1.快速开发。使用Python 语言,抽象层次高,表达能力强,开发效率高。使用数据库ORM系统,不需要手工构造SQL语句,使用Python对象访问数据库 2.大量内置应用,如后台管理系统admin ,用户认证系
Python Flask开源博客系统Blog_mini
weixin_34327761的博客
03-08 844
        本博文在51CTO技术博客首发。        开源不易,Python良心之作,真心送给广大朋友,恳请给予支持,不胜感激!                大家可以从下面的地址中去体验Blog_mini的功能,我把副本部署在了腾讯云上供大家使用:地址:Blog_mini账号:blog_mini@163.com密码:blog_mini0.Blog_mini送给你们:让每个人都轻松拥有可...
Python+Django在Eclipse环境下开发web网站
weixin_34007906的博客
03-12 3618
一、创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置。也就是通过自动生成代码来建立一个Django项目--一个Django项目的设置集,包含了数据库配置、Django详细选项设置和应用 特性配置,具体操作步骤如下所示。 1.新建Django项目选择sqlite数据库 2.创建网站模块app 3.测试新建的模块是否正常 Validating models... ...
Python web开发Django项目开发
qq_34917272的博客
10-13 863
一、Python安装 1.Windows安装 Python下载地址 2.Linux安装 yum install python -y #centos apt-get install python -y #Ubuntu pkg install python -y #termux 二、django安装 pip install django 三、django项目开发 django项目创建 django-admin startproject mysite #项目名 cd mysite #进
python web开发 django
zhuangshuanghui的博客
10-16 531
django简介 web应用框架 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式 用户操作流程图 创建第一个项目 django-admin startproject HelloWorld 目录结构 |-- HelloWorld | |-- __init__.py | |-- asgi.py | |-- settings.py | |-- urls.py | `-- ...
Python学习-包含Django的网站开发的一个例子
03-19
Python学习的基本语法-其中包含Django的网站开发的一个例子
Python项目开发Django实战-创建在线学习应用-编程案例解析实例详解课程教程.pdf
04-28
本着“挂一漏万、以点带面、以偏概全”的宗旨,以“在线学习”的应用为载体,深化对Django的理解,继续讲解一些新的技能。假设需要在网站中设计一个页面,这个页面用于向浏览者介绍网站,也就是所谓的“关于本站”。...
Python高效开发实战 Django Tornado Flask Twisted.pdf
03-01
Python高效开发实战——Django、Tornado、Flask、Twisted》内容精练、重点突出、实例丰富、讲解通俗,是广大网络应用设计和开发人员不可多得的一本参考书,同时非常适合大中专院校师生学习和阅读,也可作为高等...
Python Web框架之Django框架cookie和session用法分析
01-20
本文实例讲述了Python Web框架之Django框架cookie和session用法。分享给大家供大家参考,具体如下: part 1 概念 在Django里面,cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话。 两者...
python django web 开源项目,python项目开发案例集锦
K12345611717的博客
04-04 1065
大家好,本文将围绕python项目开发案例集锦源码展开说明,python项目开发案例集锦 pdf是一个很多人都想弄明白的事情,想搞清楚python django web 开源项目需要先了解以下几个事情。
pythonweb项目实例-Python Web项目实战Day05 - 编写Web框架
weixin_39593427的博客
11-11 638
在正式开始 Web 开发前,我们需要编写一个 Web 框架。aiohttp已经是一个 Web 框架了,为什么我们还需要自己封装一个?原因是从使用者的角度来说,aiohttp相对比较底层,编写一个 URL 的处理函数需要这么几步:第一步,编写一个用 @asyncio.coroutine装饰的函数:@asyncio.coroutinedef handle_url_xxx(request):pass第二...
python django web 开源项目,python基于django的项目
aq8821的博客
03-13 1792
Django官网:Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系models.py 用于包含模型,其中每个模型都映射到一个数据库表views.py 用于包含视图(Python 函数),其中每个视图或者返回 HttpResponse 对象(内容将显示在所请求页面上)在 settings.py 中指定数据库信息在 urls.py 中配置 URL 模式。
写文章

热门文章

  • 小程序发布上线全流程(包含小程序怎么通过审核) 40050
  • 十六进制下的(6+2) 8位数颜色代码 12765
  • 项目开发在vscode里面拉取,推送代码 10967
  • 基于网易云音乐API的微信小程序——网愈芸音乐 9188
  • Python基本数据类型有哪些 9142

分类专栏

  • 前端-地图 4篇
  • JavaScript 18篇
  • Cesium 3篇
  • Python 16篇
  • Openlayers
  • Vue2.0基础 14篇
  • 前端基础 4篇
  • 微信小程序 11篇
  • CSS 1篇
  • React 17篇
  • Taro 1篇
  • HTML DOM 2篇
  • git 1篇
  • 面试 1篇
  • 生活
  • uni-app 6篇
  • Redux 3篇
  • 大学课程 2篇
  • Java 1篇
  • PC

最新评论

  • 小程序发布上线全流程(包含小程序怎么通过审核)

    Zvemiy ): 博主我是企业类型的,微信认证加备案要多久呀一般

  • Cesium加载城市白膜数据3DTiles

    TVstart: 要是能找到会在这里问你?表情包

  • Cesium加载城市白膜数据3DTiles

    前端切图工: 博主能分享下吗 !

  • 小程序发布上线全流程(包含小程序怎么通过审核)

    偶尔躲躲乌云_0: 校园论坛类型类型的应该是可以做的(工具,咨询类目),我这种方法不行了已经~

  • 小程序发布上线全流程(包含小程序怎么通过审核)

    MU925: 博主就是我做的是那种校园论坛类型的小程序 ,但是我看好像这种类型个人做不了,你这个方法行吗·

大家在看

  • 基于nodejs+vue基于SpringBoot的在线考试系统[开题+源码+程序+论文]计算机毕业设计

最新文章

  • js实现GeoHash算法
  • Cesium加载城市白膜数据3DTiles
  • Vue template模板中无法获取到变量属性值
2023年2篇
2022年7篇
2021年32篇
2020年60篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶尔躲躲乌云_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司seo网站优化教程网站logo优化苏州网站排名优化软件网站怎么手动优化一个神一般的优化网站网站sem优化怎样2021网站标题优化四川百度网站优化排名本地百度网站优化济南网站优化与seo徐州网站快照优化崇州企业网站排名优化芝罘区品牌网站优化大良网站优化价格表哪一种在网站优化方面最有用好的网站品牌优化联系热线寻找句容网站优化太原正规的seo优化网站公司如何优化网站推广兰州优化网站安庆企业网站优化哪家服务好外贸网站如何做优化老城区网站优化排名潮州网站首页关键词优化推广衡阳专业seo网站优化平台上海青浦网站推广优化葫芦岛网站优化推广山东省网站推广优化网站内容更新优化建议网站优化好吗香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化