<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>博客 &#8211; ChaBug安全</title>
	<atom:link href="/tags/%E5%8D%9A%E5%AE%A2/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Mon, 23 Jul 2018 04:38:42 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>[Y4er]6月份作业之Django开发个人博客</title>
		<link>/code/436.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Mon, 25 Jun 2018 13:11:53 +0000</pubDate>
				<category><![CDATA[编程学习]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[博客]]></category>
		<guid isPermaLink="false">/?p=400</guid>

					<description><![CDATA[前言 在学习Python的过程中，觉得有必要学一学Python做web开发，而django作为一种优秀的Python Web框架，自然成为了我的首选，经过不到一个月的学习，总算搞清...]]></description>
										<content:encoded><![CDATA[<h1>前言</h1>
<p>在学习Python的过程中，觉得有必要学一学Python做web开发，而<span class="wpcom_tag_link"><a href="/tags/django" title="django" target="_blank">django</a></span>作为一种优秀的Python Web框架，自然成为了我的首选，经过不到一个月的学习，总算搞清楚了django的大部分结构和基本的语法，如果你想学django，就和我一起来做一个用django开发的小型个人<span class="wpcom_tag_link"><a href="/tags/%e5%8d%9a%e5%ae%a2" title="博客" target="_blank">博客</a></span>吧！</p>
<h1>了解django</h1>
<p>django是遵循MVC设计模式的框架，MVC是Model、View、Controller这三个单词的缩写，分别代表了模型，视图，控制器。对于我个人的理解来讲，模型用来与数据库进行交互，视图用来封装html、js、css，控制器则用来处理程序的请求、逻辑结构等。</p>
<h1>准备工作</h1>
<p>Python3+django2.0+PycharmPro2018</p>
<h1>创建项目</h1>
<p>你可以使用Pycharm创建，更加方便。</p>
<p>你也可以使用命令行创建，django-admin startproject myblog，当然前提是你已经安装了django，并且cd到了你想把项目创建到哪个目录的具体位置。一行命令创建了一个myblog的项目，接下来我们就该创建app了，先来讲下app与项目之间的关系。</p>
<h1>项目和app之间的关系</h1>
<p>对于django来说，项目只是一个大框架，他的具体功能还需要在app里面实现，app所对应的就是一个一个的功能模块，比如拿chabug来说，有用户模块，也有文章模块，也有专题模块。</p>
<p>你可以进入到项目的目录，然后这样来创建app <code>python3 manage.py startapp blog</code></p>
<h1>运行</h1>
<p>在Pycharm里面你只需要点击右上角的运行按钮就可以运行了，默认是运行在本地的8000端口，也就是127.0.0.1:8000，如果你需要在命令行里面运行，你可以这样python3 manage.py runserver 8000，当然这样运行的只能在本地访问，如何把我们的项目发布出去对公网用户开放呢？下面会讲到。</p>
<h1>项目结构</h1>
<pre class="lang:default decode:true">manage.py	项目管理脚本，你可以通过python3 manage.py help查看你能够干什么
settings.py	项目的设置都存放在这
urls.py	这个是用来配置项目的url，例如127.0.0.1/chabug/，或者127.0.0.1/chuyu
wsgi.py	部署的时候用到的，一般上用不到</pre>
<h1>URL与视图</h1>
<h2>
视图</h2>
<p>视图一般写在APP的views.py中，并且第一个参数永远是request对象，这个对象包含了一些请求信息，比如：请求方法GET、POST，头部headers信息等等，然后视图必须返回一个HttpResponseBase，比如下面这个：</p>
<pre class="lang:default decode:true">from django.shortcuts import render,HttpResponse
​
def hello(request):
    return HttpResponse("hello")</pre>
<p>当然，你现在并不能在浏览器中看到HttpResponse返回的hello，因为我们还没有定义urls.py中的内容，下面就跟我来配置一波把！</p>
<h2>URL映射</h2>
<pre class="lang:default decode:true">from django.contrib import admin
from django.urls import path
​
urlpatterns = [
    path('admin/', admin.site.urls),
]</pre>
<p>这是默认的配置，其中admin这一条是django系统自带的映射后台，不用管他。我们来添加一条url来映射我们的hello，首先从app导入views.py</p>
<pre class="lang:default decode:true">form blog import views</pre>
<p>然后添加一条映射关系</p>
<pre class="lang:default decode:true">from django.contrib import admin
from django.urls import path
from blog import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),
]</pre>
<p>django会自动从urlpatterns中寻找当前请求url所对应的规则，返回相应的信息。</p>
<p>这个时候在访问127.0.0.1:8000则会出现我们在视图中返回的HttpResponse信息hello</p>
<p><a href="https://i.loli.net/2018/06/24/5b2fa27c33d15.png"><img loading="lazy" class="aligncenter size-medium" src="https://i.loli.net/2018/06/24/5b2fa27c33d15.png" width="524" height="278" /></a></p>
<h2>URL传参</h2>
<p>两种方法</p>
<p>views.py</p>
<pre class="lang:default decode:true">def A(request,id):
    text = "你请求的id是:%s " % id
    return HttpResponse(text)
urls.py

from django.contrib import admin
from django.urls import path
from blog import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),
    path('A/&lt;id&gt;', views.A),
]</pre>
<p>你可以这样访问127.0.0.1/A/id</p>
<p>第二种</p>
<p>views.py</p>
<pre class="lang:default decode:true">def B(request):
    id = request.GET.get['id']
    text = "你请求的id是:%s " % id
    return HttpResponse(text)
urls.py

from django.contrib import admin
from django.urls import path
from blog import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),
    path('B/', views.B),
]</pre>
<p>你可以这样访问 127.0.0.1:8000/B/?id=1</p>
<h2>URL反转</h2>
<p>之前我们都是通过url来访问视图函数。有时候我们知道这个视图函数，但是想反转回他的url。这时候就可以通过 reverse 来实现。示例代码如下：</p>
<pre class="lang:default decode:true">reverse("list")
&gt; /book/list/
传递参数

reverse("book:detail",kwargs={"book_id":1})
&gt; /book/detail/1</pre>
<p>URL和视图我们就暂时讲到这里，接下来我们要开始写了，模板的知识会融在其中。</p>
<h1>创建模型</h1>
<pre class="lang:default decode:true">from django.db import models
​
​
class Article(models.Model):
    title = models.CharField(max_length=50)     #文章标题
    category = models.CharField(max_length=50, blank=True)  #文章分类
    datetime = models.DateTimeField(auto_now_add=True)  #文章发表日期
    content = models.TextField(blank=True, null=True)   #文章内容
​
    def __str__(self):
        return self.title
​
    class Meta:
        ordering = ['-datetime']    #以日期倒序</pre>
<p>创建完模型后我们需要把模型同步到数据库中</p>
<pre class="lang:default decode:true">python3 manage.py makemigrations
python3 manage.py migrate</pre>
<p>然后在admin.py中注册下我们创建的模型</p>
<pre class="lang:default decode:true">from django.contrib import admin
from blog.models import Article
# Register your models here.
admin.site.register(Article)</pre>
<p>注册模型让我们在django自带的后台管理中显示出来127.0.0.1:8000/admin</p>
<p>发布文章什么的都可以在这操作。</p>
<h1>URL设计</h1>
<p>我直接贴我的代码</p>
<pre class="lang:default decode:true">from django.contrib import admin
from django.urls import path
from blog import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
    path('&lt;int:id&gt;/', views.detail, name='detail'),
    path('archives/', views.archives, name='archives'),
    path('tag/&lt;str:tag&gt;', views.tags, name='tag'),
    path('search/', views.search, name='search')
]</pre>
<h1>视图设计</h1>
<pre class="lang:default decode:true">from django.shortcuts import render, redirect
from blog.models import Article
from django.http import Http404
​
# 首页视图，展示所有的文章
def index(request):
    sessionid = request.COOKIES.get('sessionid')
    post_list = Article.objects.all()
    return render(request,'index.html',{'post_list': post_list, 'sessionid':sessionid})
​
#文章详情视图，展示详细的文章内容
def detail(request,id):
    try:
        post=Article.objects.get(id=id)
    except:
        raise Http404
    return render(request,'post.html',{'post':post})
​
#文章归档
def archives(request):
    try:
        post_list = Article.objects.all()
    except Article.DoesNotExist :
        raise Http404
    return render(request, 'archives.html', {'post_list': post_list, 'error': False})
​
#分类作为标签，展示同分类下的文章
def tags(request, tag):
    post_list = Article.objects.filter(category__iexact=tag)
    return render(request,'tags.html', {'post_list': post_list})
​
#搜索
def search(request):
    if 's' in request.GET:
        s=request.GET['s']
        if not s:
            return render(request,'index.html')
        else:
            post_list=Article.objects.filter(title__icontains=s)
            if len(post_list)==0:
                return render(request, 'archives.html',{'post_list':post_list,'error':True})
            else:
                return render(request, 'archives.html',{'post_list':post_list,'error':False})
    return redirect('index')</pre>
<h1>模板设计</h1>
<h2>父模板导航条完成</h2>
<pre class="lang:default decode:true">{% load static %}
&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Index{% block title %} - MyBlog{% endblock %}&lt;/title&gt;
    &lt;link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"&gt;
    &lt;script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"&gt;&lt;/script&gt;
    &lt;link rel="stylesheet" href="http://picturebag.qiniudn.com/blog.css"&gt;
    &lt;link rel="stylesheet" href="{% static "vim.css" %}"&gt;
    {% block head %}{% endblock %}
    &lt;style&gt;
        img{
            margin-top: -20px;
            max-height: 60px;
            max-width: 150px;
        }
        .panel-body{
            width: 750px;
            margin-left: auto;
            margin-right: auto;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;nav class="navbar navbar-default"&gt;
    &lt;div class="container-fluid"&gt;
        &lt;!-- Brand and toggle get grouped for better mobile display --&gt;
        &lt;div class="navbar-header"&gt;
            &lt;a class="navbar-brand" href="{% url 'index' %}"&gt;
                &lt;img src="{% static 'logo.png' %}" alt="logo"&gt;
            &lt;/a&gt;
        &lt;/div&gt;
​
        &lt;!-- Collect the nav links, forms, and other content for toggling --&gt;
        &lt;div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"&gt;
            &lt;ul class="nav navbar-nav"&gt;
                &lt;li class="active"&gt;&lt;a href="{% url 'index' %}"&gt;首页&lt;span class="sr-only"&gt;(current)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="{% url 'archives' %}"&gt;归档&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;form class="navbar-form navbar-right" action="/search/" method="get"&gt;
                &lt;div class="form-group"&gt;
                    &lt;input type="text" class="form-control" placeholder="Search" name="s"&gt;
                &lt;/div&gt;
                &lt;button type="submit" class="btn btn-default"&gt;搜索&lt;/button&gt;
            &lt;/form&gt;
            &lt;ul class="nav navbar-nav navbar-right"&gt;
                {% block nav %}
                    {% if sessionid %}
                        &lt;li&gt;&lt;a href="/admin"&gt;进入后台&lt;/a&gt;&lt;/li&gt;
                    {% else %}
                        &lt;li&gt;&lt;a href="/admin"&gt;登陆&lt;/a&gt;&lt;/li&gt;
                    {% endif %}
                {% endblock %}
            &lt;/ul&gt;
        &lt;/div&gt;&lt;!-- /.navbar-collapse --&gt;
    &lt;/div&gt;&lt;!-- /.container-fluid --&gt;
&lt;/nav&gt;
{% block content %}
{% endblock %}
&lt;footer class="footer hidden-xs"&gt;
    &lt;div class="container"&gt;
            Copyright © 2013 ChaBug. All Rights Reserved.
    &lt;/div&gt;
&lt;/footer&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>首页完成</h2>
<pre class="lang:default decode:true">{% extends 'base.html' %}
​
{% block content %}
    &lt;div class="container"&gt;
        {% for post in post_list %}
            &lt;div class="panel-body"&gt;
                &lt;div class="entry-header page-header"&gt;
                    &lt;div class="entry-title h4"&gt;
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;{{ post.title }}&lt;/a&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-meta"&gt;
                        &lt;p&gt;Time：&lt;time&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                            分类：&lt;a href="{% url 'tag' tag=post.category %}"&gt;{{ post.category }}&lt;/a&gt;
                        &lt;/p&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-content" itemprop="description"&gt;
                        {% load markdown_deux_tags %}
                        {{ post.content|truncatechars_html:50 }}
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;Read More&lt;/a&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
​
            &lt;/div&gt;
        {% endfor %}
    &lt;/div&gt;
{% endblock %}</pre>
<h2>归档页面</h2>
<pre class="lang:default decode:true">{% extends "base.html" %}
​
{% block content %}
    &lt;div class="container"&gt;
        {% if error %}
            &lt;h1&gt;没找到相关文章&lt;/h1&gt;
        {% else %}
            &lt;section class="posts-collapse" id="post"&gt;
                &lt;span class="archive-move-on"&gt;&lt;/span&gt;
                &lt;span class="archive-page-counter"&gt;
                OK! 共找到 {{ post_list.count }} 篇日志。 继续努力。
                &lt;/span&gt;
            &lt;/section&gt;
        {% endif %}
        {% for post in post_list %}
            &lt;article class="post post-type-normal"&gt;
                &lt;header class="post-header"&gt;
                    &lt;div class="entry-title h4"&gt;
                        &lt;a href="{% url 'detail' id=post.id %}"&gt; &lt;span itemprop="name"&gt;{{ post.title }}&lt;/span&gt;&lt;/a&gt;
                    &lt;/div&gt;
                    &lt;div class="post-meta"&gt;
                        &lt;time class="post-time"&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                    &lt;/div&gt;
                &lt;/header&gt;
            &lt;/article&gt;
        {% endfor %}
    &lt;/div&gt;
{% endblock %}</pre>
<p>我把归档和同分类文章用了同一个模板，通过if判断来展示不同的页面。</p>
<h2>标签页面</h2>
<pre class="lang:default decode:true">{% extends 'base.html' %}
​
{% block content %}
    &lt;div class="container"&gt;
        分类:&lt;b&gt;{{ post_list.first.category }}&lt;/b&gt;下有{{ post_list.count }}篇日志。 继续努力。
        {% for post in post_list %}
            &lt;div class="panel-body"&gt;
                &lt;div class="entry-header page-header"&gt;
                    &lt;div class="entry-title h4"&gt;
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;{{ post.title }}&lt;/a&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-meta"&gt;
                        &lt;p&gt;Time：&lt;time&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                            分类：&lt;a href="{% url 'tag' tag=post.category %}"&gt;{{ post.category }}&lt;/a&gt;
                        &lt;/p&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-content" itemprop="description"&gt;
                        {% load markdown_deux_tags %}
                        {{ post.content|truncatechars_html:50 }}
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;Read More&lt;/a&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
​
            &lt;/div&gt;
        {% endfor %}
    &lt;/div&gt;
{% endblock %}</pre>
<h2>文章页面</h2>
<pre class="lang:default decode:true">{% extends 'base.html' %}
{% block content %}
    &lt;div class="container"&gt;
        &lt;div class="panel-body"&gt;
            &lt;div class="entry-header page-header"&gt;
                &lt;h1 class="entry-title"&gt;{{ post.title }}&lt;/h1&gt;
            &lt;/div&gt;
            &lt;div class="entry-meta"&gt;
                &lt;p&gt;Time：&lt;time&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                    分类：&lt;a href="{% url 'tag' tag=post.category %}"&gt;{{ post.category|title }}&lt;/a&gt;
                &lt;/p&gt;
            &lt;/div&gt;
            &lt;div class="entry-content"&gt;
                {% load markdown_deux_tags %}
                {{ post.content|markdown }}
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
{% endblock %}</pre>
<h1>markdown语法</h1>
<h2>安装markdown插件，</h2>
<p><span class="lang:default decode:true crayon-inline">pip3 install django-markdown-deux</span><br />
然后需要在settings.py中设置</p>
<pre class="lang:default decode:true">INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'article',
    'markdown_deux'
]</pre>
<p>在模板中像我那样调用</p>
<pre class="lang:default decode:true">&lt;div class="entry-content"&gt;
   {% load markdown_deux_tags %}
   {{ post.content|markdown }}
&lt;/div&gt;</pre>
<h1>后记</h1>
<p>我们的django开发个人博客总算是结束了，前端模板写的不好，你们可以自己写一波好看的。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
