云服务器的使用
什么是云服务器
-
服务器
本质是计算机,与个人电脑的区别在于:
- 用途:提供网络应用服务
- 开机时间:24小时不间断
-
自己配置服务器或者租用整个服务器
- 配置繁琐
- 性能不易修改
- 容易遭受攻击
- 实际使用率低
-
什么是云服务器
- 由云服务器运营商提供
- 不需要单独购买实体服务器
- 由一群服务器集合后再划分出独立的空间作为用户的主机
如何挑选云服务器
-
提供云服务器的互联网公司
- 百度云
- 腾讯云
- 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 - 输入密码,密码为盲打,不会显示出来
- 终端-输入
- macOS
-
利用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
- 解决:升级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', ] - 在Djingo项目文件夹中有一个和当前项目同名的文件夹中有一个
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'), ]
- 在blog文件夹下创建一个新文件
-
项目的
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的影响
-
这个写法优于上一个网址,因为看到网址就知道是什么内容的东西
-
这个网址就完全不知道会是什么内容,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)) - 效果如下:
- 修改blog文件中的
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')
- 在templates文件夹中再建立和当前app同名的文件夹,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.pydef 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_404get_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)
-
安装uwsgi
-
配置uwsgi.ini
示例:
-
安装nginx
-
配置nginx
-
启动uwsgi
uwsgi --ini uwsgi.ini -
启动nginx
服务器使用中常见的几个问题
- 可能是数据库没有填写我们的hosts
- 80端口可能之前已经被打开,关掉80端口即可
- ip地址没填对,要公网的ip地址
- 连上一段时间没有操作也会自动断掉
- 网络连接问题
- 安装一个screen应用
作业
【 ---- END ----】