Python_Web_使用Django搭建Web服务器

我的简书:https://www.jianshu.com/u/c91e642c4d90
我的CSDN:http://blog.csdn.net/wo_ha
我的GitHub:https://github.com/chuanqiLjp
我的个人博客:https://chuanqiljp.github.io/

版权声明:商业转载请联系我获得授权,非商业转载请在醒目位置注明出处。


安装Python的环境

Python官网下载,然后就是正常的软件安装,安装时记得勾选 Add Python 3.6 to PATH。在cmd中输入python显示了安装的版本号则表示安装成功,我的版本号为 3.7.1,

安装Python集成开发环境Pycharm

  1. Pycharm的官网下载Professional专业版并安装
  2. 激活,打开路径C:\Windows\System32\drivers\etc,修改host文件,在末尾追加域名 0.0.0.0 account.jetbrains.com,访问lanyus地址:http://idea.lanyus.com/ 点击获得注册码,打开Pycharm选中Activation code 将注册码复制进去就可以了激活,参考文章: https://blog.csdn.net/justszh/article/details/81484802

使用Pycharm创建Django工程

本文以下部分参考Django2.1新手图文入门教程

环境: windows7,Pycharm2018.3.3(必须专业版),Python3.7.1,Django2.1.5

  1. Create New Project ---> Django --->填写项目名称--->create 如下图所示


    使用Pycharm创建Django工程1

工程的目录结构

FirstWeb:.
│  manage.py  //django管理的主程序
│  
├─FirstWeb
│      settings.py//主配置文件
│      urls.py  //URL路由文件
│      wsgi.py  // 网络通信接口
│      __init__.py
│      
└─templates // html 文件们的归置目录
│  
├─venv //  虚拟环境
        

创建APP模块

在pycharm下方的terminal终端中输入命令:python manage.py startapp cmdb,此时会在工程根目录下创建cmdb模块,其目录结构如下

FirstWeb:.
└─FirstWeb
└─venv
└─....省略
└─cmdb
    │  admin.py
    │  apps.py
    │  models.py
    │  tests.py
    │  views.py
    │  __init__.py
    │  
    └─migrations
            __init__.py

现在的目录结构如图


使用Pycharm创建Django工程2

在settings.py文件内修改

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'cmdb', # 新增模块的名称
]
# LANGUAGE_CODE = 'en-us' #英文环境
LANGUAGE_CODE = 'zh-hans' # 修改为中文

在cmdb模块下的views.py编写URL的处理逻辑

from django.shortcuts import HttpResponse  # 导入HTTP响应类
def helloDjango(request):  # request参数必须有,类似self的默认规则,名字可以修改.他封装了用户请求的所有内容
    return HttpResponse("Hello  Diango world ~~~~~ ")  #在django的响应中不能直接返回字符串,需由HttpResponse封装

注册URL到urls.py路由文件中

from cmdb import views  # 先导入cmdb模块的views文件

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'hello', views.helloDjango),#注册一个新的url,参数1表示url的名称,参数2表示执行的业务逻辑的函数
]

通过上面两个步骤,我们将hello这个url指向了views里的helloDjango()函数,它接收用户请求,并返回一个“hello ...”字符串。至此,一个最简单的Django程序就写好了,此时运行一下如果没有报错就可以在浏览器打开链接http://127.0.0.1:8000/hello看到输出的字符串了,如下图

使用Pycharm创建Django工程3
使用Pycharm创建Django工程4

返回一个Html文件

1.在templates文件夹下创建index.html文件并编写如下内容

<html>
<head>
    <title>文档标题</title>
</head>
<body>
文档内容......
</body>
</html>
  1. 在views.py中编写业务逻辑
def indexHtml(request):
    """
    返回一个HTML文件,当想渲染一个html文件时,需要使用render方法进行打包
    """
    return render(request, "index.html")  # 参数1固定,参数2:指定返回的html文件
  1. 在urls.py注册url地址
    path(r'index/',views.indexHtml),#url名称若为文件需要在末尾加斜杠,该url的业务逻辑为views.indexHtml函数
    path(r'', views.indexHtml),  # 默认的主页

其实在settings.py的TEMPLATES字典的DIRS字段中指明了html文件存放的目录,可以修改,一般默认就行了

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        '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文件返还给用户了,但是还不够,前端三大块,html、css、js还有各种插件,它们齐全才是一个完整的页面。在django中,一般将静态文件放在static目录中。接下来,在mysite中新建个static目录。


picture1

你的CSS,JS和各种插件都可以放置在这个目录里。

为了让django找到这个目录,依然需要对settings进行配置:


picture2

同样,在index.html文件中,可以引入js文件了:

picture3

重新启动web服务,刷新浏览器,查看结果。

接收用户发送的数据

上面,我们将一个要素齐全的html文件返还给了用户浏览器。但这还不够,因为web服务器和用户之间没有动态交互。下面我们设计一个表单,让用户输入用户名和密码,提交给index这个url,服务器将接收到这些数据。

  1. 先修改index.html文件,注意action属性不要写错
<html>
    <head>
        <title>
            文档标题
        </title>
    </head>
    <body>
        文档内容......
        <h1>
            用户输入
        </h1>
        <form action="/index/" method="post">
            <input type="text" placeholder="请输入您的用户名" name="userName" />
            <input type="password" placeholder="请输入您的密码" name="userPwd" />
            <input type="submit" value="提交" />
        </form>
    </body>
</html>
  1. 修改views.py
def indexHtml(request):
    """
    返回一个HTML文件,当想渲染一个html文件时,需要使用render方法进行打包
    """
    if request.method == "POST":
        name = request.POST.get("userName", None)
        pwd = request.POST.get("userPwd", None)
        print("name={0},pwd={1}".format(name, pwd))
    return render(request, "index.html")  # 参数1固定,参数2:指定返回的html文件
  1. 关闭跨域保护,修改settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',#跨站请求保护机制,将它关闭。
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

返回动态页面

收到了用户的数据,但返回给用户的依然是个静态页面,通常我们会根据用户的数据,进行处理后在返回给用户。这时候,django采用jinja2语言编写动态模板,jinja2会根据提供的数据,替换掉html中的相应部分.

  1. 先改造views.py文件:
# 创建一个用户列表,预先存储两个数据
user_list = [{"user": "tom", "pwd": "123456"},
             {"user": "bob", "pwd": "147258"},
             ]
def indexHtml(request):
    """
    返回一个HTML文件,当想渲染一个html文件时,需要使用render方法进行打包
    """
    if request.method == "POST":
        name = request.POST.get("userName", None)
        pwd = request.POST.get("userPwd", None)
        print("name={0},pwd={1}".format(name, pwd))
        tem = {"user": name, "pwd": pwd}
        user_list.append(tem)
    return render(request, "index.html",{"data": user_list})  # 参数1固定,参数2:指定返回的html文件,参数3是后台返回给浏览器的数据是一个字典,"data"键名为一个指针会被对应到html中使用
  1. 再改造index.html文件:
<html>
    <head>
        <title>
            文档标题
        </title>
    </head>
    <body>
        文档内容......
        <h1>
            用户输入
        </h1>
        <form action="/index/" method="post">
            <input type="text" placeholder="请输入您的用户名" name="userName" />
            <input type="password" placeholder="请输入您的密码" name="userPwd" />
            <input type="submit" value="提交" />
        </form>
        <h1>
            用户已输入的数据展示
        </h1>
        <table border="1">
            <thead>
                <th>
                    用户名
                </th>
                <th>
                    密码
                </th>
            </thead>
            <tbody>
                {#   注释: jinja2的语法,下面表示一个for循环,data是views的indexHtml函数传递过来的key值 ,在jinja2中,存在三种语法: 控制结构 {% %},变量取值 {{ }},注释 {# #} #}
                {% for line in data %}
                <tr>
                    <td>
                        {{ line.user }}
                    </td>
                    <td>
                        {{ line.pwd }}
                    </td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </body>
</html>
picture5

使用数据库

上面我们虽然和用户交互得很好,但并没有保存任何数据,页面一旦关闭,或服务器重启,一切都将回到原始状态。使用数据库是毫无疑问的,django通过自带的ORM框架操作数据库,并且自带轻量级的sqlite3数据库。下面我们来看一看:

  1. 首先是注册app,修改settings.py,注册它,你的数据库就不知道该给哪个app创建表。然后我们在settings中,配置数据库相关的参数,如果使用自带的sqlite,不需要修改。使用MySQL请参考
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'cmdb',# 注册新的模块
]
# 默认无需修改
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
  1. 再编辑models.py文件,也就是MTV中的M。
#只要修改了整个文件,需要执行cmd命令"python manage.py makemigrations"和"python manage.py migrate"去修改sql文件
class UserInfo(models.Model):#该类必须继承models.Model类
    username = models.CharField(max_length=32, default=None)# 创建一个字段,长度为32个字符
    password = models.CharField(max_length=32, default=None)

接下来要在pycharm的teminal中通过命令创建数据库的表了。有2条命令,分别是:python manage.py makemigrations

image

再输入命令:python manage.py migrate

image

还可以 创建数据库超级用户,在控制台执行以下命令python manage.py createsuperuser,这里创建后可在url为admin下去登录后台(Django的默认管理后台),此外还注册数据库里的表格,在模块目录下的admin.py文件里注册

from .models import UserInfo
admin.site.register(UserInfo)
  1. 修改views.py中的业务逻辑
from cmdb import models
def indexHtml(request):
    """
    返回一个HTML文件,当想渲染一个html文件时,需要使用render方法进行打包
    """
    if request.method == "POST":
        name = request.POST.get("userName", None)
        pwd = request.POST.get("userPwd", None)
        print("name={0},pwd={1}".format(name, pwd))
        models.UserInfo.objects.create(username=name, password=pwd)  # 添加数据到数据库
    users = models.UserInfo.objects.all()  # 从数据库中读取所有行
    # 若UserInfo中的字段名和html中使用的字段名对应可省略下面的转换操作
    user_list = []
    for user in users:#遍历从数据库中取出的数据转换为待展示的字典格式
        tem = {"user": user.username, "pwd": user.password}
        user_list.append(tem)
    print(user_list)
    return render(request, "index.html",{"data": user_list})  # 参数1固定,参数2:指定返回的html文件,参数3是后台返回给浏览器的数据是一个字典,"data"键名为一个指针会被对应到html中使用

本文参考:

Django新手图文教程
在pycharm中创建Django项目流程

推荐阅读更多精彩内容