python网站开发入门(python+Django)

375 阅读20分钟

云服务器的使用

什么是云服务器

  • 服务器

    本质是计算机,与个人电脑的区别在于:

    1. 用途:提供网络应用服务
    2. 开机时间:24小时不间断
  • 自己配置服务器或者租用整个服务器

    1. 配置繁琐
    2. 性能不易修改
    3. 容易遭受攻击
    4. 实际使用率低
  • 什么是云服务器

    1. 由云服务器运营商提供
    2. 不需要单独购买实体服务器
    3. 由一群服务器集合后再划分出独立的空间作为用户的主机

如何挑选云服务器

  • 提供云服务器的互联网公司

    • 百度云
    • 腾讯云
    • ali云
    • 美团云
    • 网易云
    • amazon web services
    • ucloud
    • Google Cloud Platform
  • 如何挑选

    • 大厂商云服务器质量有保障,价格稍高

    • VPS:类似云服务器,价格低,不稳定

如何使用云服务器

  • 购买云服务器-ali云为例

    • ali云官网:cn.aliyun.com/
    • 首页-最新活动-新手上路,寻找一些免费、试用、低价的套餐(如果是可以完成学生认证的,可以买学生专属的计划,很便宜)
    • 云计算基础:选择轻量应用服务器
    • 预装环境:系统镜像、Ubuntu 16.04 64位(对新手友好)、地区选择:看用户大多数在哪里进行选择
  • 购买云服务器-ali云为例(如果都无法参加优惠活动)

    • ali云管理控制台-云计算基础服务
    • 云服务ECS-实例-创建实例
    • 基础配置
      • 计费方式:包年包月/按量付费,根据自己实际情况
      • 地域:用户大多数在哪里选哪里,或者选择有优惠的地域
      • 实例:第一个tab是【仅显示最新一代】,我们练手不需要,切换到【所有代】
        • 架构:x86计算
        • 分类:练手不需要太高级的配置,可以选【入门级(共享)】
      • 公共镜像:Ubuntu 16.04 64位
      • 存储:高效云盘,默认40G
      • 购买周期:先买一周
    • 网络与安全组
      • 网络:默认专用网络,不用改
      • 公网带宽:按固定带宽/按使用流量付费,根据自己的情况选择
      • 安全组,默认
      • 弹性网卡,默认
    • 系统配置
      • 登录凭证,密码比较简单,安全性低
      • 实例名称
    • 分组设置
      • 默认
    • 确认订单
      • 下单,支付
  • 使用云服务器

    • ali云管理控制台-云计算基础服务:展示服务器列表
    • 实例详情
    • 点击远程连接,进入服务器操作界面
  • 终端控制及传输工具

    • 远程连接服务器工具
      • win puTTY
    • 传输管理服务器文件工具
      • win WinSCP
  • SSH登录服务器

    • macOS
      • 终端-输入ssh root@服务器ip
      • 输入密码,密码为盲打,不会显示出来
  • 利用SFTP客户端导入文件

    • win

    • mac?

基础的Linux命令

  • 一个博客网站示例
    • 创建项目:服务器上,输入命令mezzanine-project makerbean
    • 创建数据库:python3 manage.py createdb
    • 输入我们购买的云服务器的公网ip
    • 输入邮箱、密码
    • 是否添加demo页面,yes
    • 运行sudo python3 manage.py runserver 0.0.0.0:80
    • 通过公网ip可以访问(这是别人的一个博客项目,后续会自己学习搭建)
    • 如果无法访问,可能是因为防火墙问题,在云服务器ECS-安全组规则,确认80端口是不是所有人都可以访问。

作业

Djiago基础及前端入门

为什么用Djiago

  • 免费开源
  • 功能丰富
  • 开发迅速
  • 可拓展性强
  • 模版系统
  • 后台管理

新建python虚拟环境

作用:多项目时可能要使用不同版本的包、库

步骤:

  • 新建一个项目文件夹,比如website
  • 在命令行利用cd命令进入到website
  • 输入python3 -m venv djangoenv
  • 在website文件夹内会出现一个djangoenv文件夹
  • windows输入djangoenv\scripts\activate激活虚拟环境
  • mac输入source djangoenv/bin/activate激活虚拟环境
  • 命令行开头会出现(djangoenv)字样

安装Django并新建项目

  • 安装Django pip install django

    报错:ERROR: Could not find a version that satisfies the requirement django (from versions: none) ERROR: No matching distribution found for django

    • 解决:升级pip命令pip install --upgrade pip
  • 安装完成后输入django-admin startproject my_blog创建网站项目

    其中my_blog是django网站项目的名称,自己命名,注意不要取django或者test之类的名称容易冲突,就会在website文件夹下生产一个my_blog文件夹,

  • 初始化生成文件的用途

    • manage.py 一个在命令行中可以调用的网站管理工具
    • my_blog文件夹下:
      • init.py 告诉python这个文件夹是一个模块
      • setting.py my_blog项目的一些配置
      • urls.py 网站内的各个网址声明
      • wsgi.py web服务器与Django项目的接口
  • 检查Djngo项目是否安装成功

    • cd my_blog

    • python3 manage.py runserver

      如下图,没有报错,红字提示可以暂时忽略:

    • 可访问http://127.0.0.1:8000/

前端入门

  • 什么是前端?什么是后端

    • 前端:你所能看见的,图、文字
    • 后端:存储、逻辑数据
  • 前端开发用什么?

    • Chrome浏览器调试网站
  • 前端三个重要方面

    • HTML

      • HyperText Markup Language 超文本标记语言
      • 网页最基本的元素
      • 通过标记语言的方式来组织内容(文字、图片、视频)
      • HTML元素解析
        • <开始标签 属性名=属性值>内容<结束标签>

          <p class='info-list'>这是一个段落<\p>

      • 建立一个HTML文件,保存为index.html
        <!DOCTYPE html>
        <html>
        <head>
        	<title> 我 的 博 客</title>
        </head>
        <body>
        	<h1>静夜思</h1>
        	<p>窗前明月光</p>
        	<p>疑似地上霜</p>
        	<p>举头望明月</p>
        	<p>低头思故乡</p>
        </body>
        </html> 
        
    • CSS

      • Cascading Style Sheets 样式层叠表

      • 它定义一个网页该如何显示里面的元素,比如这个段落在左边还是右边,这段文字是什么颜色、字体等。

      • 建立一个css文件,保存为index-style.css

        p {
        	color:blue;
        	font-family:KaiTi;
        }
        
      • 建立css与html的联系,在index.html的<title>下添加<link>

        <!DOCTYPE html>
        <html>
        <head>
        	<title> 我 的 博 客</title>
        	<!--建立css与html的联系-->
        	<link rel="stylesheet" type="text/css" href="index-style.css"> 
        </head>
        <body>
        	<h1>静夜思</h1>
        	<p>窗前明月光</p>
        	<p>疑似地上霜</p>
        	<p>举头望明月</p>
        	<p>低头思故乡</p>
        </body>
        </html> 
        
      • css解析

        选择器{
            属性名:属性值;
        }
        
      • id与class - id在每个html文件只有一个 - class可以有多个

      • 盒子模型

        • 内容及盒子边框中间是padding,即内边距
        • 边框与边框外其他元素之间是margin,即外边距
    • JavaScript

      • 主要用于前端的编程语言

      • 为网站提供动态、交互效果

      • 建立一个js文件,保存为index.js

        //定义一个字符串变量
        var alertText="hello world";
        //在网页弹出一个提示框
        alert(alertText);
        
      • 建立js与html的关系,同<link>标签一样,在<title>下加一个<script>标签

        <script type="text/javascript" src="index.js"></script>

作业

Django视图

Django视图和网址

  • python manage.py runserver

    当我们运行这条命令时,会提示:

    You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.

    Run 'python manage.py migrate' to apply them.

    参照它的提示,运行python manage.py migrate,当运行完这个命令之后,可以看到my_blog文件夹下多了db.sqlite3这个文件,相当于网站的基本数据的数据库

  • 新建一个Django App

    • 在命令行中进入到django项目的文件夹,输入python manage.py startapp blog

    • 完成后多处一个blog文件夹

  • 将App添加到setting.py里

    • 在Djingo项目文件夹中有一个和当前项目同名的文件夹中有一个setting.py文件,在INSTALLED_APPS添加一个blog
    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    ]
    

Django的MTV模式

Brower -- 浏览器;URL -- 网址;View -- 视图;Model -- 模型;Database -- 数据库;Template -- 模版

视图

  • 编写视图函数
    • 打开blog/views.py文件,默认界面如下:

    • 编写views.py,添加如下语句:

      from django.shortcuts import render
      from django.http import HttpResponse
      # 定义一个index函数处理主页的访问请求,request包含了用户的浏览器传来的HTTP请求内容
      def index(request):
          # 用HttpResponse函数直接返回一段文字给用户
      	return HttpResponse("欢迎来到我的博客 ")
      

网址

  • 创建urls.py

    • 在blog文件夹下创建一个新文件urls.py,用于处理网址的解析
    • 编写urls.py,添加以下内容
      from django.urls import path
      from . import views
      
      urlpatterns = [
      	path('',views.index,name='index'),
      ]
      
  • 项目的urls.py

    • my_blog文件下有urls.py,跟blog文件夹下创建一个新文件urls.py不是同一个,区别在于blog文件夹下的urls.py是管理blog系统的网址,my_blog文件下有urls.py是管理整个项目的地址

    • 打开my_blog/urls.py

      表示配置了ip:port/admin的网址,我们访问一下,启动服务python3 manage.py runserver后,访问http://127.0.0.1:8000/admin,可以看到是一个管理员登录界面

  • 创建一个管理员账号

    • 在项目根目录上运行python manage.py createsuperuser

    • 输入username

    • 输入Email address

    • 输入password ,不显示的,盲打

  • 用管理员账户登录后台

    • 运行python manage.py runserver

    • 浏览器中打开http://127.0.0.1:8000/admin,输入username和password登录

    • 点击user,可以管理现有用户的相关信息、权限

  • 配置项目的urls.py

    • 修改为:

      from django.contrib import admin
      # 添加一个include
      from django.urls import path,include
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          # 当网址是/blog时,交给blog.urls去处理
          path('blog/',include('blog.urls')),
      ]
      
    • 运行python manage.py runserver,访问http://127.0.0.1:8000/blog/,出现了在view里写的那句话:

    • 梳理一下此处的流程

      项目的urls.py文件中配置了path('blog/',include('blog.urls')),表示当网址为http://ip:port/blog/的时候,会去找blog中的urls.py文件,文件中配置了path('',views.index,name='index'),表示网址'',即blog/后面没有内容时这个网址,去找views.py中的index函数,返回了index的return,即我们所见的内容,欢迎来到我的博客

  • 更复杂的网址处理

    • 修改blog文件中的urls.py,添加一行path('<int:blog_id>',views.blog_detail,name='blog_detail')

    • '<int:blog_id>'表示这段网址是个数字,存在blog_id这个变量

    • views.py添加一个blog_detail的函数,重启服务,效果如下:

      def blog_detail(request,blog_id):
          return HttpResponse("这是我的第{}篇博客".format(blog_id))
      

    • 不同类型的变量,参考:

作业

拓展:SEO

  • SEO ,Search Engine Optimization,搜索引擎优化
  • 网址对SEO的影响
  • 所以在设计网址时,要对这方面进行考虑
  • 复杂网址演示
    • 修改blog文件中的urls.py,添加一行path('<slug:blog_title>',views.blog_title,name='blog_title')
    • 在views.py中新增对应的函数
          def blog_title(request,blog_title):
              return HttpResponse("这是我的标题为{}的博客".format(blog_title))
      
    • 效果如下:

Djingo模板

模板演示

  • 建立blog下templates文件夹

  • 添加博客首页HTML

    • 在templates文件夹中新建一个blog_index.html
    • 在blog_index.html写简单的欢迎内容
      <!DOCTYPE html>
      <html>
      <head>
      	<title>我的博客-首页</title>
      </head>
      <body>
      	<h1>welcome to my blog</h1>
      	<h3>好好学习,天天向上</h3>
      	<ol>
      		<li>Python</li>
      		<li>C++</li>
      		<li>Java</li>
      	</ol>
      
      
      </body>
      </html>
      
  • blog/views.py中的index函数修改为:

    def index(request):
        # render渲染,表示返回渲染的网页blog_index.html
        return render(request,'blog_index.html')
    
  • 访问http://127.0.0.1:8000/blog/,就是blog_index.html的内容

理解模版系统

在views.py中指定渲染某个模版,如:

def index(request):
    return render(request,'blog_index.html')

Django会自动搜寻各个App的templates文件夹,然后在blog/templates/blog_index.html中找到。

  • 不同的app中可能存在同名的html文件,容易产生冲突怎么办?
    • 在templates文件夹中再建立和当前app同名的文件夹,html文件放到该文件夹中,即原来的blog/templates/blog_index.html,改为blog/templates/blog/blog_index.html
    • 修改views.py内容: return render(request,'blog/blog_index.html')
    • 为了更规范,html的文件名也不再叫blog_index.html,改为index.html,所以对应的view.py中的内容改为return render(request,'blog/index.html')

Django模板进阶

  • 变量 {{变量}}

    • 将index.html中的h1内容用{{welcome}}代替

    • 将views.py中的index函数添加一个字典

      def index(request):
      	return render(request,'blog/index.html',{'welcome':'欢迎来到本渣的博客首页'})
      
    • welcome变量的地方被替代

  • 渲染列表

    • views.py中index函数修改为如下语句,

      def index(request):
      	language_list=['Python','C++','Java']
      	return render(request,'blog/index.html',{'welcome':'欢迎来到本渣的博客首页','language_list':language_list})
      
    • index.html中修改代码为,{%代码%}表示代码逻辑

      将列表渲染为我们注释掉的代码一样

      <!DOCTYPE html>
      <html>
      <head>
      	<title>我的博客-首页</title>
      </head>
      <body>
      	<h1>{{welcome}}</h1>
      	<h3>好好学习,天天向上</h3>
      	<ol>
      	<!--for循环-->
      	{%for item in language_list%}
      		<li>{{item}}</li>
      	<!--与python语法不一样的地方,模版中需要有结束语句,html文件不会按照缩进处理-->
      	{%endfor%}
      	</ol>
      	<!-- 	<ol>
      		<li>Python</li>
      		<li>C++</li>
      		<li>Java</li>
      	</ol> -->
      </body>
      </html>
      
    • 获取循环次数 forloop.counter表示循环数字,从1开始

      <li>{{item}} -- {{forloop.counter}}</li>

      如果要从0计数,用forloop.counter0

  • 渲染字典

    • views.py中index函数修改为如下语句:

      def index(request):
      	language_list=['Python','C++','Java']
      	link_dict={
      	'douban':'https://www.douban.com/',
      	'baidu':'https://www.baidu.com/',
      	'google':'https://www.google.com.hk/'}
      	return render(request,'blog/index.html',
      	{'welcome':'欢迎来到本渣的博客首页',
      	'language_list':language_list,
      	'link_dict':link_dict})
      
    • index.html<body>中添加如下代码:

      <a href="{{link_dict.douban}}">豆瓣</a>
      <a href="{{link_dict.baidu}}">百度</a>
      <a href="{{link_dict.google}}">谷歌</a>
      

  • 模版中的条件判断

    • views.py中index函数修改为如下语句:

      def index(request):
      	language_list=['Python','C++','Java']
      	link_dict={
      		'douban':'https://www.douban.com/',
      		'baidu':'https://www.baidu.com/',
      		'google':'https://www.google.com.hk/'
      	}
      	flag=True
      	return render(request,'blog/index.html',
      		{'welcome':'欢迎来到本渣的博客首页',
      		'language_list':language_list,
      		'link_dict':link_dict,
      		'flag':flag}
      		)
      
    • index.html<body>中添加if判断:

      <!DOCTYPE html>
      <html>
      <head>
      	<title>我的博客-首页</title>
      </head>
      <body>
      	<h1>{{welcome}}</h1>
      	<h3>好好学习,天天向上</h3>
      
      	{% if flag %}
      		<p>窗前明月光,疑似地上霜</p>
      	{% else %}
      		<p>这里没有内容</p>
      	{% endif %}
      	
      	<a href="{{link_dict.douban}}">豆瓣</a>
      	<a href="{{link_dict.baidu}}">百度</a>
      	<a href="{{link_dict.google}}">谷歌</a>
      	
      	<ol>
      	{%for item in language_list%}
      		<li>{{item}} -- {{forloop.counter}}</li>
      	{%endfor%}
      	</ol>
      
      </body>
      </html>
      

  • 判断用户是否登录

    • index.html添加

      {% if request.user.is_authenticated %}
      	<p>{{request.user.username}},welcome</p>
      {% else %}
      	<p>请登录</p>
      {% endif %}
      

      当我在127.0.0.1:8000/admin管理后台退出登录后:

  • 使用现成的博客模版

    startbootstrap.com/ 选择自己喜欢的模板

    • 例如:在themes下选择blog

    • 选择clean blog模板

    • 下载模板、解压

    • 用下载模板的index.html文件,替换掉我们之前的index.html文件,可以看到如图,因为找不到相关的js、css、图片等素材

    • 拷贝素材

      • 在项目的根目录中新建一个static文件夹

      • 在static文件夹下新建一个对应的blog文件夹,拷贝下载素材中的css、img、js、vendor四个素材到blog文件夹中

    • 修改setting.py

      • 打开setting.py,在最后一行添加 STATICFILES_DIRS=[os.path.join('static')]
    • 修改index.html

      加载static:{% load static %}

      找到所有css、js、图像,修改链接如下:

      原:

      <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

      修改为:

      <link href="{%static 'blog/vendor/bootstrap/css/bootstrap.min.css'%}" rel="stylesheet">

      搜索关键字 css、js、img,注意还要在原路径下加blog/

      <header class="masthead" style="background-image: url('{%static 'blog/img/home-bg.jpg'%}')">

      <script src="{%static 'blog/vendor/jquery/jquery.min.js'%}"></script>

      <script src="{%static 'blog/vendor/bootstrap/js/bootstrap.bundle.min.js'%}"></script>

      如果报错可以在终端上或者网页控制台看看怎么回事,例如:

      路径有问题,404,就是忘了加blog/

  • 修改博客模板的内容

    • <title>欢迎来到我的博客</title>

    • <h1>DayBreak's Blog</h1>

    • <span class="subheading">我的博客有人气吗?</span>

  • 修改index.html,添加模板参数

    • 找到index.html中和博文相关的内容

      每个<div class="post-preview">是一组,<a href="post.html">对应每篇博客详情页的链接

    • 修改代码如下

      {% for post in post_list %}
      <div class="post-preview">
        <a href="{{post.link}}">
          <h2 class="post-title">
            {{post.title}}
          </h2>
          <h3 class="post-subtitle">
            {{post.subtitle}}
          </h3>
        </a>
        <p class="post-meta">Posted by
          <a href="#">{{post.author}}</a>
          {{post.date}}</p>
      </div>
      <hr>
      {% endfor %}
      
  • 修改views.py

    def index(request):
    	post_list=[
    		{
    			'link':'/first_blog',
    			'title':'震惊!这是第一篇博客的大标题',
    			'subtitle':'不用震惊,这是第一篇博客的副标题',
    			'author':'DayBreak',
    			'date':'2020-03-27'
    		},
    		{
    			'link':'https://www.baidu.com',
    			'title':'震惊!这是第二篇博客的大标题',
    			'subtitle':'不用震惊,这是第二篇博客的副标题',
    			'author':'DayBreak',
    			'date':'2020-03-27'
    		}
    
    	]
    	return render(request,'blog/index.html',
    		{'post_list':post_list}
    		)
    

作业

Django模型

认识数据库

  • 存储数据的仓库
  • 什么是数据?
    • 学生的姓名、性别、成绩;
    • 用户的银行卡号、密码、余额、交易记录
    • 网站的登录账号、密码、评论
    • 游戏的用户名、装备、属性、等级

数据是如何存在数据库中

  • 一张张表存储各种信息

  • 表与表之间还可能有不同的联系

Django中的数据库

  • 打开blog应用里的models.py文件

  • 加入以下内容

    #继承于models.Model, 新建了叫post的表格
    class Post(models.Model):
    
    	# 有title属性
    	title=modesl.CharField(max_length=80)
    
  • 同步数据库

    • 根目录运行python manage.py makemigrations
    • 得到如下提示,表示创建了Post模型
    • 继续命令运行python manage.py migrate
    • 得到如下提示

利用admin后台系统管理数据

  • 运行python manage.py runserver启动服务器

  • 修改blog文件夹中的admin.py

    from django.contrib import admin
    from .models import Post
    
    # Register your models here.
    admin.site.register(Post)
    
  • 登录admin后台系统

    • 访问http://127.0.0.1:8000/admin,会看到新增了一个栏目

  • admin后台系统管理

    • 点击Posts进入,可以看见还没有内容发布过

    • 点击ADD POST,可直接添加一个Post的title

    • 在title中输入内容,SAVE保存,保存后叫Post project(1),不直观

    • 修改blog文件夹里的models.py

      class Post(models.Model):
      
      # 有title属性
      title=models.CharField(max_length=80)
      
      def __str__(self):
      		return self.title
      

      此时,这里就展示的是你输入的title的内容

设计博文模型

  • 一篇博客相关的信息如下:

    • 标题
    • 副标题
    • 作者
    • 发表日期
    • 标签
    • 分类
    • 博文内容
    • 博文链接
    • 点赞数(可选)
    • 阅读量(可选)
  • Django中可用的各类模型

    目前常用: - CharField 简单文字模型 - DateTiemField 时间模型 - TextField 大段文字模型

  • 设计博文模型简易版

    这样设计存在什么问题?

    作者、标签、分类存在同一个表中,会造成大量重复的内容、不易检索、不易修改。

  • 设计博文模型进阶版

博文基础模版

  • models.py添加一些基础模型

    class Post(models.Model):
    
    	title=models.CharField(max_length=80)
    	subtitle=CharField(max_length=120)
    	publish_date=models.DateTimeField()
    	content=models.TextField()
    	link=models.CharField(max_length=200)
    
    	def __str__(self):
    			return self.title
    
  • 关联作者模型

    from django.db import models
    from django.contrib.auth.models import User`
    
    class Post(models.Model):
    
    title=models.CharField(max_length=80)
    subtitle=CharField(max_length=120)
    publish_date=models.DateTimeField()
    content=models.TextField()
    link=models.CharField(max_length=200)
    # 利用ForeignKey()即把字段author关联另外一个模型
    author=models.ForeignKey(User,on_delete=models.CASCADE) 
    
    def __str__(self):
    		return self.title
    

新建分类模型和标签模型

添加两个class,同时补充Post类

class Category(models.Model):
	"""分类"""
	name = models.CharField(max_length=100)
	def __str__(self):
			return self.name

class Tag(models.Model):
	"""标签"""
	name = models.CharField(max_length=100)
	def __str__(self):
			return self.name

class Post(models.Model):
	title=models.CharField(max_length=80)
	subtitle=models.CharField(max_length=120)
	publish_date=models.DateTimeField()
	content=models.TextField()
	link=models.CharField(max_length=200)
	# 利用ForeignKey()即可关联另外一个模型
	author=models.ForeignKey(User,on_delete=models.CASCADE) 
	category=models.ForeignKey(Category,on_delete=models.CASCADE) 
	# 利用MangToManyField()关联另外一个模型
	tag=models.ManyToManyField(Tag,blank=True)

	def __str__(self):
			return self.title
  • ForeignKey()和ManyToManyField()的区别

    • 一对多的关系,使用ForeignKey()

      一篇文章只有一个分类,一个分类下有多个文章

    • 多对多的关系,使用MangToManyField()

      一个文章可以有多个标签,一个标签会对应多个文章

  • 新建了2个模型,所以要在admin.py中添加

    from django.contrib import admin
    from .models import Post
    from .models import Category
    from .models import Tag
    
    # Register your models here.
    
    admin.site.register(Category)
    admin.site.register(Tag)
    admin.site.register(Post)
    

运行Django的管理命令

  • 只要修改了models.py文件,都需要运行python manage.py makemigrations

    会提示:

    意思为:

    选择1方案,填写默认值1,除了时datetime填timezone.now

    创建成功:

  • 每次运行完python manage.py makemigrations,都要运行python manage.py magrate

  • 注意:如果这里运行python manage.py magrate时一直报错,难以结局,可以尝试删掉my_blog下的db.sqlite3文件,再重新运行python manage.py magrate,再重新创建admin账号即可。

admin后台查看

  • 进入到后台管理,可以看到新增了Category、Tag

  • 点击Posts-Add post,新增了我们写的字段

  • 添加Category,比如添加编程分类

  • 添加Tag,比如添加Python标签

  • 再进入到post,可以发现Category可选编程,Tag可以选Python,直接点击添加也可

从数据库提取真正的博文信息

  • 修改views.py
    • 引入Post模型 from .models import Post

    • 列出全部的Post数据,按发表日期倒序排列 Post.objects.all().order_by('-publish_date')

    • 修改如下:

      from django.shortcuts import render
      from django.http import HttpResponse
      from .models import Post
      
      # Create your views here.
      
      def index(request):
      	post_list=Post.objects.all().order_by('-publish_date')
      	return render(request,'blog/index.html',{'post_list':post_list})
      

设计博客详情页网址

  • 每篇博文有一个英文的网址,如127.0.0.1:8080/blog/django-course-1

  • 后台link只需要填django-course-1部分

  • 修改index.html的博客详情页链接,设计为blog/link

    <a href="/blog/{{post.link}}">

  • 将时间那里改为我们的时间变量

    <p class="post-meta">Posted by
            <a href="#">{{post.author}}</a>
            {{post.publish_date}}</p>
    
  • 修改urls.py的网址配置,将blog_detail的参数改为blog_link path('<int:blog_link>',views.blog_detail,name='blog_detail'),

  • 修改views.py from django.shortcuts import render,get_object_or_404

    get_object_or_404表示从某个模型根据关键字提取某段数据,找不到返回数据,就返回404页面

    def blog_detail(request,blog_link):
        post=get_object_or_404(Post,link=blog_link)
        return HttpResponse(post.content)
    
  • 在管理后台配置一篇博客,看下效果

添加博客详情页模版

我们下载的模版中,有一个post.html的文件,就是我们博客详情页的模版,把它用到我们项目中,放在我们app的/templates/blog下.

  • 修改views.py

    def blog_detail(request,blog_link):
    
    	post=get_object_or_404(Post,link=blog_link)
    	# 返回博文详情
    	return render(request,'blog/post.html',{'post':post})
    
  • 修改post.html

    同我们修改index.html一样,把js、css、img的路径进行修改:

    <link href="{%static 'blog/vendor/bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">

    修改title、标题、副标题、作者、正文、时间:

更漂亮的正文排版

方式一:在后台的content中直接写html代码,比较麻烦;

方式二:采用Markdown格式编写博文(推荐)

  • 安装markdown模块 pip install markdown2

  • 修改views.py

    def blog_detail(request,blog_link):
    
    	post=get_object_or_404(Post,link=blog_link)
    	post.content = markdown2.markdown(post.content)
    	# 返回博文详情
    	return render(request,'blog/post.html',{'post':post})
    
  • 后台博客content中用markdown语法进行编辑

    发现没有对标签进行渲染,如何解决?

    在post.html中的{{post.content}}修改为{{post.content|safe}}

    遗留问题,这里貌似不支持代码块的展示,待解决

调整url

现在的url是127.0.0.1:8000/blog/首页,我们希望127.0.0.1:8000就是首页

  • 修改my_blog的urls.py
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('',include('blog.urls')),
    ]
    
  • 修改blog的urls.py
    urlpatterns = [
    	path('',views.index,name='blog_index'),
    	path('blog/<slug:blog_link>/',views.blog_detail,name='blog_detail'),
    ]
    

如何把网站对外发布

  • 购买服务器和域名
    • 服务器见文章最前面部分

    • 域名

      • 国内:wanwang.aliyun.com
      • 国外:godaddy.com
      • .cn/.com等域名需要实名认证
    • 服务器或者域名在国内买的,需要进行备案,没有备案的话,有可能会被墙掉

    • 购买后,设置域名解析,表示该域名指向的服务器ip地址

Django部署

(不详细讲,自行google)

  1. 安装uwsgi

  2. 配置uwsgi.ini

    示例:

  3. 安装nginx

  4. 配置nginx

  5. 启动uwsgi uwsgi --ini uwsgi.ini

  6. 启动nginx

服务器使用中常见的几个问题

  1. 可能是数据库没有填写我们的hosts
  2. 80端口可能之前已经被打开,关掉80端口即可
  3. ip地址没填对,要公网的ip地址
  4. 连上一段时间没有操作也会自动断掉
  5. 网络连接问题
  6. 安装一个screen应用

作业

【 ---- END ----】