Django新手配置教程

Django 框架在服务器上的配置,以及简易web应用

安装

建议在虚拟环境中来运行,以下的应用是基于Centos7系统,Anaconda Python3.7虚拟环境下,Django2.2版本

在conda虚拟环境下安装Django:

# pip install django

创建Django项目

使用django-admin命令来创建

# django-admin startproject mysite

会自动在当前目录创建一个mysite文件夹,里面包含了初始化的项目文件结构:

mysite/
    manage.py
    db.sqlite3
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

其中:

  • mysite: 项目的容器,包含主要的配置文件
  • manage.py: Django的命令行工具,它包含了可对Django项目进行操控的命令集
  • mysite/init.py: 一个空文件
  • mysite/settings.py: Django 项目的配置文件
  • mysite/urls.py: Django 项目的 URL 注册文件
  • mysite/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口

这时可以测试一下是否创建成功:

# python manage.py runserver 0:8000    // 后面的地址和端口可以不加,默认是localhost:8000

然后在浏览器上输入localhost:8000会看到django的默认页面

  • 首次运行时可能会在页面上可能到DisallowHost错误,这时要修改mysite/settings.py文件,将其中的ALLOWED_HOSTS = []括号中添加ip地址,
    或者直接ALLOWED_HOSTS = ['*']来允许所有ip访问

运行一个Django项目

1.创建app

django的程序运行一般是通过app来实现的,可以在命令行创建app:

# python manage.py startapp polls     // 创建名为polls的app

这时整个mysite的结构变为:

mysite/
    manage.py
    db.sqlite3
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py

2.编辑网页内容

下一步是设计你想要在页面上显示的内容,它是由app目录下的views.py文件决定的,对于polls app来说,就是polls/views.py文件

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
    
def another(request):
    return HttpResponse("Now here is another page.")

Django的网页内容访问通常都是访问的views.py中的函数,比如上面的index函数

3.注册url地址

然后为你刚刚涉及的内容注册一个url地址,以便能够在浏览器地址输入栏中找到它

在Django中,url的注册有点类似层层递进,需要配置两个文件:

    1. mysite目录下的urls.py文件

修改mysite/urls.py成以下内容

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

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

其中path()后面的第一个参数'polls/'指的是url子地址;第二个参数include('polls.urls')意为该url子地址指向的是polls这个app

    1. app目录下的urls.py文件

新建polls/urls.py文件,输入以下内容:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('another', views.another, name='another'),
]

与上面类似,path()后面的第一个参数指的是url子地址(在本例中将index函数设计成polls app的根地址,所以该参数是一个空字符串);第二个参数意为
该url子地址指向的是views.py中的某个函数;第三个name是一个可选参数,为url地址命名,这样可以方便模板套用等统一的操作

4.运行

经过以上两个文件的配置,此刻再运行这个项目

# python manage.py runserver 0:8000

然后在浏览器中输入localhost:8000/polls/localhost:8000/polls/another就能分别看到index和another两个函数返回的字符串

使用模板

在前面的例子中,页面上显示的内容是在views.py中编辑的,但是对于大型网页,会使views.py变得非常复杂

通常的做法是将页面内容写在一个html文件中,再在views.py中渲染它

1.新建模板文件

首先在mysite的根目录下创建一个templates文件夹,用于存放html模板文件

# mkdir templates

然后在templates中创建一个base.html文件

<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <title>Test Page</title>
    <meta charset="UTF-8"/>
</head>

<body>
    <h1>h1h1h1h1h1</h1>
    <h2>h2h2h2h2h2h2h2h2</h2>
</body>
</html>

2.添加路径到Django的默认设置

为了使用方便,可以将templates文件添加到Django项目的默认路径中

修改mysite/settings.py文件:

TEMPLATE_DIR = os.path.join(BASE_DIR, 'templates')  # 新建一个路径变量

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR,],    # 添加到这里
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

这样项目中的其他文件在寻找html模板时就会自动到templates中查找

3.在views.py中渲染模板

在上面的polls app的基础上,修改views.py文件:

from django.http import HttpResponse
from django.shortcuts import render  # 导入Django的渲染方法

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
    
def another(request):
      return render(request, 'base.html')   # 在这里直接使用base.html作为参数,会自动向templates路径下查找

4.运行

此时再运行这个项目

# python manage.py runserver 0:8000

在浏览器中输入localhost:8000/polls/another就能看到页面显示的是base.html中的内容

使用数据库

Django非常优秀的一点是它可以很方便的与服务器上的数据库连接,下面以MYSQL数据库为例展示简单用法

1.修改默认数据库

Django的默认数据库是Sqlite3,如果想要为项目使用其他的数据库(比如MYSQL)需要修改配置文件mysite/settings.py

# 修改DATABASES字段
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',         # 数据库名称,它必须是已存在的数据库
        'USER': 'test',
        'PASSWORD': 'test123',
        'HOST':'localhost',
        'PORT':'3306',
    }
}

然后运行命令:

# python manage.py migrate

就会在db_name数据库中创建一系列表(此前确保db_name数据库已经存在,否则会报错)

所创建的表是依据mysite/settings.py文件中INSTALLED_APPS配置项里面的内容

可能出现的错误

有时执行migrate会提示找不到mysqlclient(比如在centos7系统中),如何在centos7中安装mysqlclient参考
这里

或者使用pymysql来实现migrate,首先安装pymysql:

# pip install pymysql

然后修改mysite/__init__.py,在其中添加:

import pymysql

pymysql.install_as_MySQLdb() 

此时运行python manage.py migrate仍然会报错,错误发生在一个base.py文件中,编辑它(换成自己的路径):

# vim /usr/local/python3/lib/python3.7/site-packages/django/db/backends/mysql/base.py

注释掉其中的35 36行

再次运行python manage.py migrate仍然会报错,错误发生在一个operations.py文件中,编辑它(换成自己的路径):

# vim /usr/local/python3/lib/python3.7/site-packages/django/db/backends/mysql/operations.py

将其146行的decode替换为encode

此时可以正常运行python manage.py migrate

2.在数据库中添加自定义的数据

针对MYSQL数据库,在数据库中创建表是通过在app目录下models.py创建新类来实现的

    1. 首先创建models

编辑polls/models.py文件:

from django.db import models

class Question(models.Model):   # 类名对应表名
    # 变量名(question_text)对应列名,后面代表数据类型,CharField相当于mysql中的varchar
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

为了能够将polls这个app连接到数据库,还需要进行一项配置:在mysite/settings.py文件的INSTALLED_APPS配置项中,添加:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # 这一行是新添加的,代表polls app(polls路径下有一个apps.py文件)
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  • 2.然后运行命令:
# python manage.py makemigrations polls

会看到打印出类似下面的信息,表示app包含成功:

Migrations for 'polls':
  polls/migrations/0001_initial.py:
    - Create model Choice
    - Create model Question
  • 3.最后,在数据库中创建表格:
# python manage.py migrate

会看到类似如下信息:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Rendering model states... DONE
  Applying polls.0001_initial... OK

说明表格创建成功,可以到mysql数据库中查看

3.在Django中添加已有的数据库

首先修改mysite/settings.py中的DATABASES:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'name',            # 改成要添加的数据库名
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'yourpasswd',
    }
}

然后在命令行中:

# python manage.py inspectdb > ./polls/models.py

就会在polls文件夹中生成新的models.py替换原来的文件

再执行:

# python manage.py migrate

就将新的数据库添加到了django的配置当中

  • tips:注意要在mysite/setings.py中的 INSTALLED_APPS 配置项中添加对应的app

4.管理已有数据库

用上面的方法添加已有数据库可能会出现一些问题,比如在migrate的时候因为格式不匹配等,可能会强制改变原来数据库的数据格式,
下面介绍一种方式可以将原有的数据库比较好的匹配到django框架当中:

  • 1.首先将数据库备份
# mysqldump -u user -ppassword database > database.sql

user、password、database分别对应用户名、密码和数据库名

  • 2.为django app生成model
# python manage.py inspectdb > ./app/models.py

此时会在该app的models.py文件中生成相应的代码用来构造数据库

注意要将models.py中的Meta里面managed属性修改为True,使得Django有操作数据库的权限:

class Meta:
    managed = True
  • 3.创建新的数据库并添加到Django的settings中

首先在mysql中创建一个新的数据库,比如djangodb

MariaDB [(none)]> CREATE DATABASE djangodb;

然后修改mysite/settings.py,配置数据库和app信息(注意要修改两处):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangodb',         # 改成新的数据库
        'USER': 'test',
        'PASSWORD': 'test123',
        'HOST':'localhost',
        'PORT':'3306',
    }
}

INSTALLED_APPS = [
    'app_name.apps.App_nameConfig',  # 将app_name和App_name换成自己app的名称
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  • 4.执行migrate

首先添加app的内容:

# python manage.py makemigrations app_name

然后全部迁移:

# python manage.py migrate
  • 5.从备份文件导入数据

进入到mysql中,选中djangodb数据库:

MariaDB [(none)]> use djangodb;

将备份文件中的数据导入数据库:

MariaDB [(none)]> source database.sql;

这种方法比较神奇的地方在于导入数据之后数据的格式和原本的数据库格式相同

此时原来的数据库的数据就完美的融入了Django框架啦

5.在Django中使用redis数据库作为缓存

设置了redis作为django的缓存数据库后就可以使用django内置的cache方法来直接缓存数据,不需要再通过额外的调用python的redis扩展库

需要安装django-redis扩展库,官方文档

# pip install django-redis

使用方法

首先需要再settings中添加这样一段:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",      # IP 端口 和数据库编号
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "mysecret"    # 密码
        }
    }
}

然后就可以在django项目中直接访问redis

from django.conf  import settings
from django.core.cache import cache   # 通过cache来访问缓存,此时的默认缓存已经设置成了redis

#read cahce user_id
def read_from_cache(self,username)
   key='user_id_of'+username
   value=cache.get(key)
   if value==none:
       data=none
   else:
       date=json.loads(value)
   return data

#write cahche
def write_to_cache(self,username)
    key='user_id_of'+username
    cache.set(key,json.dumps(username),settint.NEVER_REDIS_TIMEOUT)
  • tips

django-redis的功能不是很全,查询和写入时只能够使用简单的get和set方法,不能使用诸如hash等功能

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容