• Django之基础应用


    Django简单使用

    版本选择

    LTS:表示官方长期支持版本,我们选择1.11.xx版本

    安装方法

    windows:

    pip3 install django==1.11.11

    pycharm:

    settings ==> Project Interpreter ==> 右边框+号 ==> 搜django ==> specify version ==> install

    检查安装是否成功:

    django-admin

    pip源

    指定源: pip3  install  django==1.11.11  -i  源

    阿里云      http://mirrors.aliyun.com/pypi/simple/
    
    豆瓣        http://pypi.douban.com/simple/
    
    清华大学    https://pypi.tuna.tsinghua.edu.cn/simple/

    创建django项目

    命令行版本创建:

    django-admin startproject mysite

    pycharm版本创建:

    File ==> New Project ==> 选择Django,改一下项目位置 ==>  Create ==> 选择New Window! 

    一步到位同时创建app:

    创建django项目的时候 ==> more settings ==> Application name 添加

    或者pycharm创建:

    pycharm下方terminal, python3 manage.py startapp appname

    Django中app的概念

    project相当于一个大项目,APP相当于这个项目里的一个个功能(一个Django项目可以分为很多个APP,用来隔离不同功能模块的代码。

    为什么要用APP?方便我们再一个大的Django项目中,管理时间不同的业务功能。

    创建app:

    创建django项目的时候 ==> more settings ==> Application name 添加

    或者pycharm创建:

    pycharm下方terminal, python3 manage.py startapp appname

     

    apps.py  = app相关配置项

    views.py = 放函数的文件

    tests.py = 写测试的

    有了一个新app以后就应该告诉django有了一个新app,再settings里设置

     

    目录介绍

    mysite/
    
    ├── manage.py             # 管理文件 django项目的入口文件
    
    └── mysite                # 项目目录
    
        ├── __init__.py
    
        ├── settings.py       # 配置
    
        ├── urls.py           # 路由 --> URL和函数的对应关系
    
        └── wsgi.py           # runserver命令就使用wsgiref模块做简单的web server

    运行Django项目

    cmd运行:

    cd /d D:PycharmProjectsmysite
    python3 manage.py runserver IP:端口      # 在指定的IP和端口启动
    python3 manage.py runserver 端口         # 在指定的端口启动
    python3 manage.py runserver             # 默认在本机的8000端口启动

    pycharm运行:

    , 修改端口的话 点击下拉Edit修改

    启动Django报错:

    Django 启动时报错 “UnicodeEncodeError ...”

    报这个错误通常是因为计算机名为中文,改成英文的计算机名重启下电脑就可以了。

    Django 启动报错“SyntaxError: Generator expression must be parenthesized”

    报这个错很大可能是因为使用了Python3.7.0,而目前(2018-06-12)Python3.7.0和Django还有点兼容性问题,换回Python3.6的环境即可。

    配置Django项目

    project-name/settings.py:你的Django项目的的配置文件

    现阶段django项目要做以下三个设置:

    配置HTML文件存放位置:

    # 所有跟HTML文件相关的设置都放这里
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            # 告诉Django 我用的HTML文件你都去哪个目录找
            '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',
                ],
            },
        },
    ]

    配置静态文件存放位置:

    # 所有静态文件(css/js/图片,这些都是静态文件),都放在下面的配置的文件夹中
    STATIC_URL = '/static/'                 # 静态文件保存目录的别名,引用静态文件位置加的是这个
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"),   # 静态文件存放位置
    ]

    注释csrf那一行:

    注释掉setting.py中 带有 csrf 的那一行(大概45~47行)

     

    用户上传文件

    这个配置之后才会用到可以先不配置

    static文件下的文件可以被用户访问,是因为我们在settings里设置了静态文件路径,用户就可以从static文件夹里直接拿文件,页面上要显示头像也是要从本地拿文件,所以也需要开一个口子

    # Django用户上传的都叫media文件
    MEDIA_URL = "/media/"
    # media配置,用户上传的文件都默认放在这个文件夹下
    MEDIA_ROOT = os.path.join(BASE_DIR, "media")
    # 设置完成还得加media相关的路由设置
    from django.views.static import serve
    from django.conf import settings
    url(r'^media/(?P<path>.*)$', serve, {"document_root": settings.MEDIA_ROOT}),

    Django基础必备三件套:

    from django.shortcuts import HttpResponse, render, redirect

    HttpResponse

    HttpResponse:回一个http的响应,它自己会封装协议、状态码等等
    内部传入一个字符串参数,返回给浏览器。
    例如:
    def index(request):
        # 业务逻辑代码
        return HttpResponse("OK")

    render

    除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
    将数据填充进模板文件,最后把结果返回给浏览器。
    例如:
    def index(request):
        # 业务逻辑代码
        return render(request, "index.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})

    redirect

    接受一个URL参数,表示跳转到指定的URL。

    例如:

    def index(request):
        # 业务逻辑代码
        return redirect("/home/")

    练习:Django版登陆

     form表单复习

    form表单往后端提交数据需要注意三点:

    1. form不是from,所有获取用户输入的标签都应该放在form里面, 并且必须要有name属性
    2. action属性控制往哪儿提交,method一般都设置成post
    3. 提交按钮必须是type=submit,不能是别的类型

    流程

    1. 设置路由
    2. 登陆页面
    3. 执行函数
    4. 启动django项目
    5. 解析路径,执行函数
    6. render替换页面字符串返回真正的想让用户看到的HTML
    7. 用户浏览器渲染页面
    8. close

    设置路由

    from app01 import views
    urlpatterns = [
        url(r'^login/', views.login),
    ]

    登陆页面

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
        <link rel="stylesheet" href="/static/fontAwesome/css/font-awesome.min.css">
        <title>mysite-登录页面</title>
        <style>
            body {
                background-color: #eee;
            }
        </style>
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-4 col-md-offset-4" style="margin-top: 100px">
                <h1 class="text-center">请登录</h1>
                <form class="form-horizontal" action="/login/" method="post">
                    <div class="form-group">
                        <label for="inputEmail3" class="col-sm-2 control-label"></label>
                        <div class="input-group col-sm-8">
                             <span class="input-group-addon"><i class="fa fa-envelope-o fa-fw"></i></span>
                            <input type="email" name="email" class="form-control" id="inputEmail3" placeholder="Email">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="inputPassword3" class="col-sm-2 control-label"></label>
                        <div class="input-group col-sm-8">
                            <span class="input-group-addon"><i class="fa fa-key fa-fw"></i></span>
                            <input type="password" name="pwd" class="form-control" id="inputPassword3" placeholder="Password">
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="input-group col-sm-offset-2 col-sm-8">
                            <div class="checkbox">
                                <label>
                                    <input type="checkbox"> 记住我
                                </label>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="input-group col-sm-offset-2 col-sm-8">
                            <button type="submit" class="btn btn-primary btn-block">登录</button>
                        </div>
                    </div>
                    <p class="text-danger text-center">{{ error }}</p>
                </form>
            </div>
        </div>
    </div>
    </body>
    </html>
    View Code

    执行的函数

    def login(request):
    # 定义要给空字符串,用于登陆失败的时候重新赋值显示
        error_msg = ""
        # 如果是POST请求: 取出数据,做出如登陆判断
        # 登陆失败还需要返回登陆页面,并新增一个提示
        if request.method == 'POST':  # 请求方法必须是大写
            email = request.POST.get('email', None)
            pwd = request.POST.get('pwd', None)
            if email == '123@qq.com' and pwd == '123':
                # 登陆成功
                # 回复一个特殊的响应,这个响应会让用户的浏览器请求指定的URL
                return redirect("http://www.baidu.com/")
            else:
                # 登陆失败
                error_msg = '邮箱或密码错误'
        # 不是POST就走下一步(GET请求: 返回页面)
        return render(request, 'login.html', {"error": error_msg})
  • 相关阅读:
    poj 3264(RMQ或者线段树)
    LCA上的RMQ模板算法
    LCA离线算法Tarjan的模板
    poj 1330(初探LCA)
    hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)
    hdu 4496(并查集逆向添边)
    hdu 1829(继续扩展并查集)
    poj 1182 (扩展并查集)
    hdu 3038(扩展并查集)
    hdu 3371(kruskal)
  • 原文地址:https://www.cnblogs.com/lxfpy/p/10859835.html
Copyright © 2020-2023  润新知