Django精要:Blog应用开发+Github版本控制+PythonAnywhere部署

Django精要

基本的上线过程就是1,本地服务器做测试,2,本地项目上传到github,3,线上服务器从github clone项目,上线
每次新建一个页面(应用),常规操作都是1,setting注册APP,2,urls设置路由使得服务器可以找到新的页面(urls用于调用views中函数),3,views当请求request来的时候可以返回页面到前端(views中函数用于调用HTML页面)

django安装

1,建立目录

mkdir djangogirls
cd djangogirls

2,建立虚拟环境

python -m venv myvenv
C:\Users\Name\djangogirls> C:\Python34\python -m venv myvenv

3,进入虚拟环境

C:\Users\Name\djangogirls> myvenv\Scripts\activate
(myvenv) C:\Users\Name\djangogirls>

4,安装django

(myvenv) ~$ pip install django==1.8
Downloading/unpacking django==1.8
Installing collected packages: django
Successfully installed django
Cleaning up...

4.0,创建第一个django项目mysite

(myvenv) C:\Users\Name\djangogirls> django-admin startproject mysite .
#后面的点千万不能忘记

4.1, 更改设置setting.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
TIME_ZONE = 'Asia/Shanghai'

4.2, 设置数据库

python manage.py migrate

4.3, 开启服务器

python manage.py runserver

blog应用安装与设置

4.4.0,新建blog应用

python manage.py startapp blog 

4.4.1,更改blog/models.py,主要作用是对数据库做修改

from django.db import models
from django.utils import timezone
class Post(models.Model):
    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()
    def __str__(self):
        return self.title

4.4.2,在setting.py中INSTALL_APPS中添加blog,

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
)

4.4.3,更新数据库 python manage.py makemigrations blog
4.4.4,迁移文件 python manage.py migrate blog
4.4.5,打开 blog/admin.py 文件,并替换其中的文件像这样:

from django.contrib import admin
from .models import Post
admin.site.register(Post)

4.4.6,启动测试服务器 python manage.py runserver 出现管理界面admin
4.4.7,创建超级管理员账号 python manage.py createsuperuser,完成账户与密码设置后可以登录后台管理界面。

django blog应用部署到PythonAnywhere

  1. 使用git做版本控制
$ git init
Initialized empty Git repository in ~/djangogirls/.git/#建立git仓库
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
  1. 建立.gitignore文件用于git忽略一些文件
*.pyc
__pycache__
myvenv
db.sqlite3
.DS_Store

可以使用git status来查看
然后做添加并确认准备上传到github的文件

$ git add --all .
$ git commit -m "My Django Girls app, first commit"
  1. 创建github仓库my-first-blog,拷贝github仓库接口https://github.com/YafeiXu/my-first-blog.git
  2. 连接本地git仓库和github仓库,上传本地git仓库代码到github仓库使用push
    如果出现问题可以修改.git目录下的config文件中的目录设置
连接本地git仓库和github仓库
$ git remote add origin https://github.com/<your-github-username>/my-first-blog.git
上传本地git仓库到github仓库
$ git push -u origin master
  1. 使用git clone拷贝github仓库项目到PythonAnywhere
使用Pythonanywhere的shell,然后在Pythonanywhere上导入github仓库中的项目
git clone https://github.com/<your-github-username>/my-first-blog.git 

5.1. 在 PythonAnywhere 上创建 virtualenv

$ cd my-first-blog
在 PythonAnywhere 上创建虚拟环境
$ virtualenv --python=python3.5 myvenv
在 PythonAnywhere 上进入虚拟环境
$ source myvenv/bin/activate
安装django
(myvenv) $ pip install django==1.8

5.2. 在 PythonAnywhere 上创建数据库

创建数据库
$ python manage.py migrate
创建超级用户名
$ python manage.py createsuperuser

5.3. 将Django项目作为Web App发布
到这里,我们的Django项目已经在PythonAnyWhere上了,虚拟环境也准备好了,数据库也创建好了,此时就可以将它作为Web App发布了!在PythonAnyWhere里,点击 “Web”选项卡 -> 点击 “Add a new web app”
-> 确认域名 -> 选择manual configuration(注意不是选择“Django”哦) -> 选择Python3.5 -> 点击Next以最终完成向导。

5.4. 配置Web App的虚拟环境
创建好了Web App之后,PythonAnyWhere就会将你带到该Web App的配置界面,点击Virtualenv下面红色的字体来编辑虚拟环境的位置,将地址修改为:

/home/<你的PythonAnyWhere的账户名>/my-first-blog/myvenv

5.5. 配置PythonAnyWhere里的WSGI文件
仍然是在Web选项卡,点击WSGI configuration file后面的蓝色字体连接(如下图所示)。
PythonAnyWhere将带我们到一个新的页面(一个代码编辑器),将编辑器的代码全部用下面的代码替换。

import os
import sys

path = '/home/<你的PythonAnyWhere用户名>/my-first-blog'  # 在这里使用你自己的用户名和GitHub项目的名字。
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' # 在这里mysite请用settings所在文件夹名,我用的是和GitHub仓库名一样的名字
from django.core.wsgi import get_wsgi_application
from django.contrib.staticfiles.handlers import StaticFilesHandler
application = StaticFilesHandler(get_wsgi_application())

点击 “Save” -> 返回Web选项卡 -> 点击大大的绿色按钮“Reload”。此时我们就可以通过Web选项卡上提供的地址(也就是XXX.pythonanywhere.com)访问了!这样我们的网站就真正在互联网上存在了,虽然只有两个月的有效期

5.6. 如何将GitHub里项目的修改反馈到PythonAnyWhere?
项目又要修改的时候,通常是在本地计算机修改,修改好之后发布到GitHub,之后发布到PythonAnyWhere。当GitHub里项目修改好之后,在PythonAnyWhere的Bash里面输入下面两行代码就可以同步了:
注意:如下代码表示需要在PythonAnyWhere的Bash中执行!!

cd my-first-blog
git pull

Django网址路由urls

  1. 每一个新的应用都需要在urls.py中注册路由
  2. 现在我们创建一个新的 blog/urls.py 空文件。好了!加入以下两行:
from django.conf.urls import url
from . import views

urlpatterns = [
url(r'^$', views.post_list, name='post_list'),
]
  1. 修改blog/views.py文件
    view是存放应用逻辑的地方。 它将从你之前创建的 模型 中获取数据,并将它传递给 模板 。
from django.shortcuts import render

# Create your views here.

def post_list(request):
    return render(request, 'blog/post_list.html', {})

Django模板templates

模板保存在 blog/templates/blog 目录中。 因此,首先在您的 blog 目录内创建一个称为 templates 的目录。 然后创建另一个称为 blog 的目录到你的 templates 目录,现在创建一个叫做 post_list.html 的文件 (现在是空的,别管它) 到 blog/templates/blog 目录下。重新启动测试服务器python manage.py runserver
post_list.html

<html>
<head>
<title>Django Girls blog</title>
</head>
<body>
<div>
<h1><a href="">Django Girls Blog</a></h1>
</div>
<div>
<p>published: 14.06.2014, 12:14</p>
<h2><a href="">My first post</a></h2>
<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi po
rta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum mass
a justo sit amet risus.</p>
</div>
<div>
<p>published: 14.06.2014, 12:14</p>
<h2><a href="">My second post</a></h2>
<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi po
rta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut f.</p>
</div>
</body>
</html>

使用git更新网页

  1. 本地shell操作
git status
git add --all .
绿色显示准备上传文件
git status
git commit -m "Changed the HTML for the site."
上传到github仓库
git push
  1. Pythonanywhere操作
$ cd ~/my-first-blog
$ source myvenv/bin/activate
从github获取项目文件
(myvenv)$ git pull
覆盖之前的同名文件
(myvenv)$ python manage.py collectstatic
  1. 最后,跳到 Web tab 并点击对应你的 Web 应用程序的 Reload 。你的更新应已上线!刷新你的浏览器,看到更新了吧 :)

Django ORM 和 QuerySets(查询集)

  1. blog/views.py中修改
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
#按时间顺序排列帖子
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

Django模板修改

  1. 为了用模板标签在HTML中显示变量, 我们会使用两个大括号, 并将变量包含在里面,正如这样{{ posts }},即把python变量嵌入HTML中,用来显示后台调用的内容。
  2. 修改\blog\templates\blog\post_list.html
<html>
<head>
<title>Django Girls blog</title>
</head>
<body>
<div>
<h1><a href="/">Django Girls Blog</a></h1>
</div>
{% for post in posts %}
<div>
<p>published: {{ post.published_date }}</p>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
</body>
</html>
  1. 上传到github
$ git status
[...]
$ git add --all .
$ git status
[...]
$ git commit -m "Modified templates to display posts from database."
[...]
$ git push
  1. 更新Pythonanywhere
$ cd my-first-blog
$ git pull

最后, 我们返回 Web tab 重新加载我们的应用程序, 此时我们应该可以看到更新后的程序运行情况了。

使用bootstrap框架

  1. 若要安装Bootstrap,您需要将它添加到你的 .html 文件的 中:
    blog/templates/blog/post_list.html
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
  1. 在blog应用的目录下创建一个名为 static 的文件夹,在新建一个css文件夹
h1 a {
color: #FCA205;
}
  1. 修改HTML文件post_list.html
{% extends 'blog/base.html' %}
{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
{% endblock %}
  1. 创建基础模板
{% load staticfiles %}
<html>
<head>
<title>Django Girls blog</title>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
<link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text
/css'>
<link rel="stylesheet" href="{% static 'css/blog.css' %}">
</head>
<body>
<div class="page-header">
<h1><a href="/">Django Girls Blog</a></h1>
</div>
<div class="content container">
<div class="row">
<div class="col-md-8">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
  1. 修改blog/urls.py增加路由
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
    url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
]
  1. 为每一篇博文增加页面,扩展base.html
    修改blog/templates/blog 中创建一个文件,叫做 post_detail.html
{% extends 'blog/base.html' %}
{% block content %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endblock %}
  1. 重新部署
$ git status
[...]
$ git add --all .
$ git status
[...]
$ git commit -m "Modified templates to display posts from database."
[...]
$ git push

更新Pythonanywhere

$ cd my-first-blog
$ git pull

最后, 我们返回 Web tab 重新加载我们的应用程序, 此时我们应该可以看到更新后的程序运行情况了。

表单

  1. 创建一个文件,把它的名字放在 blog 目录下。
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title', 'text',)
  1. 修改HTML base.html
{% load staticfiles %}
<html>
<head>
<title>Django Girls blog</title>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
<link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text
/css'>
<link rel="stylesheet" href="{% static 'css/blog.css' %}">
</head>
<body>
<div class="page-header">
<a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
<h1><a href="/">Django Girls Blog</a></h1>
</div>
<div class="content container">
<div class="row">
<div class="col-md-8">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
  1. 修改blog/urls.py添加
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
    url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
    url(r'^post/new/$', views.post_new, name='post_new'),
]
  1. 修改views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404
from .forms import PostForm

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

def post_new(request):
    form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})
  1. 在目录blog/templates/blog下新建post_edit.html
{% extends 'blog/base.html' %}
{% block content %}
<h1>New post</h1>
<form method="POST" class="post-form">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
{% endblock %}
  1. 修改views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404
from .forms import PostForm

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            #此处有问题return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})
  1. 修改blog/templates/blog/post_detail.html
{% extends 'blog/base.html' %}
{% block content %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-penci
l"></span></a>
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endblock %}
  1. urls.py中添加url(r'^post/(?P<pk>[0-9]+)/edit/$', views.post_edit, name='post_edit'),
  2. views.py中添加
def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'blog/post_edit.html', {'form': form})
  1. 修改base.html使得只有管理员才可以发帖
{% if user.is_authenticated %}
<a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
{% endif %}
  1. 重新部署
$ git status
[...]
$ git add --all .
$ git status
[...]
$ git commit -m "Modified templates to display posts from database."
[...]
$ git push

更新Pythonanywhere

$ cd my-first-blog
$ git pull

最后, 我们返回 Web tab 重新加载我们的应用程序, 此时我们应该可以看到更新后的程序运行情况了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值