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项目流程

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

推荐阅读更多精彩内容

  • 切换到创建项目的目录 cd C:\Users\admin\Desktop\DjangoProject创建名为pr...
    在努力中阅读 3,195评论 2 3
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,861评论 1 3
  • (一)、启动服务器 (二)、创建数据库表 或 更改数据库表或字段 Django 1.7.1及以上 用以下命令 1....
    夏天夏星阅读 5,544评论 0 17
  • 转自:https://weibo.com/ttarticle/p/show?id=2309404129469920...
    xpf2000阅读 4,672评论 0 48
  • 早餐后乘车前往中缅边境第一小镇——国家级口岸打洛,参观【国门边境】。这里也是第二个购物项目翡翠,卖翡翠的真的...
    娟_07ba阅读 228评论 0 1