美文网首页
Python_Web_使用Django搭建Web服务器

Python_Web_使用Django搭建Web服务器

作者: 在代码下成长 | 来源:发表于2019-01-20 18:22 被阅读12次

    我的简书: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项目流程

    相关文章

      网友评论

          本文标题:Python_Web_使用Django搭建Web服务器

          本文链接:https://www.haomeiwen.com/subject/tgxfjqtx.html