zoukankan      html  css  js  c++  java
  • Django-基础-1

    Django 的学习
    https://www.cnblogs.com/yuanchenqi/articles/8875659.html
    https://www.cnblogs.com/yuanchenqi/articles/7629939.html
    http://www.cnblogs.com/haiyan123/p/7701412.html
    
    MTV 模型
        M  model      (负责业务对象和数据库的关系映射)(orm)
        T  template   (存放html,负责把页面展示给用户)
        V  view          (视图,负责业务逻辑,在适当的时候调用model和template)
        Django 有一个URL控制器(路径和函数关系的映射,pattern),根据URL  pattern  来分发给不同的view函数处理,view调用相应的model和template 返回页面给用户
    一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
    
    django  的安装
    pip3 install django(目前最新版本是2.0)
    我们上课的时候用的是1.x版本,所以这里我也装1.11版本的
    pip3 install django==1.11
    django 是下载在python3 解释器的lib 目录下面了
    下载完成后会看到我们的scripts 多了django-admin.exe   django-admin.py
    
    使用django-admin.py startproject myproject 创建项目
    使用cd myproject && python3 manage.py startapp app01 创建应用
    我们使用命令行或者是pycharm 创建一个项目,项目名是Myproject,然后我们再创建一个应用的名字app01
    创建完成之后的目录结构是这样的
    
    myproject-------------------------->这个是项目名,可以更改
        app01-------------------------->项目应用的名称,我们要是有多个应用这里我们还可以有app02,app03
            migrations
                __init__.py
                admin.py
                models.py
                tests.py
                views.py
        myproject----------------------->这个名字不可更改,这里的配置是应用于全局配置的
            __init__.py
            settings.py----------------->存放项目的配置文件
            urls.py--------------------->路径和视图函数的映射关系,看urlpatterns字典,当应用很多的时候,我们应该在每个应用里面创建一个urls.py
            wsgi.py--------------------->和socket相关
        templates----------------------->存放各种html文件,css,js 会放在新的static文件夹
        manage.py----------------------->与Django项目进行交互的脚本,启动的时候我们执行python manage.py runnserver IP PORT,默认8000端口
    
    这里我们分不同的应用是为了解耦
    url 匹配规则自上而下。上面匹配上了,不再往下匹配
    
    HttpResponse :封装响应体的类,返回任何数据,都应该放在HttpResponse里返回
    
    这里举例我们的url 路径是timer  那么就会匹配上这一条规则 url(r'^timer/', views.timer),就去执行
    视图函数中的timer(形参xxx)函数,传入一个request 实参,request 包含所有的请求信息,当我们请求的时候
    Django中的wsgi把所有的请求信息封装成request对象,封装好之后立马传给timer,timer 函数要是利用任何一个
    request 的任意一个对象信息的时候直接从request对象里取就可以了
    
    render : render(request, template_name[, context])
        结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
        按照settings配置指定的路径找到html 文件
    参数:
         request: 用于生成响应的请求对象。
         template_name:要使用的模板的完整名称,可选的参数,这里我们直接templates目录下的html文件名即可,因为在setting.py 中 TEMPLATES 列表配置了templates的环境变量,'DIRS': [os.path.join(BASE_DIR,'templates')]
         context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
         content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
         status:响应的状态码。默认为200。
         render 其实最终也是调用的HttpResponse
    
        ctime = str(time.time())
        name = 'bigbao'
        age = '18'
        return render(request,"time.html",{'ctime':ctime,'name':name,'age':age})
        这里的“ctime” key 是html模板中要引用的,ctime是上面函数取到的
    
    模板语法: 目的是将变量(数据库的内容)如何巧妙的嵌入到html页面中(就不用之前我们用的字符串拼接了)
    在 Django 模板中遍历复杂数据结构的关键是句点字符,语法:
    {{var_name}}   
    
    render 方法有两个功能:
                        返回一个页面
                        模板语法:将变量巧妙的嵌入html页面中
    return HttpResponse("访问成功") 返回的一定是一个字符串,如果想返回纯字符串,就用HttpResponse方法
    
    
    我们在post数据的时候我们可以再request.POST 对象里面取到我们提交的数据
    比如说我们在form表单里提交了我们input里定义的两个input元素名称 user_name 和 pwd,那么我们就可以再request.post.get('user_name')
    和request.post.get('pwd') 取到相应的值
    
    
    
    URL控制器
        url组成部分:
            协议://ip(域名):端口/路径?参数
        url的功能: url路径和视图函数的映射关系
        1、一旦匹配成功则不再继续
        2、若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    
        # 无名分组:
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive)  给函数传入两个实参
    
        # 有名分组(就是给分组起个名字,这样定义的好处就是按照关键字参数去传参了,指名道姓的方式)语法:(?P<name>pattern)
        url(r'^article/(?P<year>d{4})/(?P<month>d{2})$', views.year_month_hasname),这样函数year_month_hasname里会有两个形参的名字是year和moth和位置无关
    
    
        URL 分发:
            这里我们应该解耦,我们可以把每个URL pattern 放在自己的应用下面,在我们自己的应用下面创建一个urls.py文件
            全局配置的urls.py 需要配置如下
            from django.conf.urls import url,include
            url(r'^app01/', include('app01.urls'))    也就是说访问路径以app01 开头的路径都到app01 下面的的urls去匹配规则
    
        URL 反射:我们把我们的url路径加上一个别名,然后直接调用别名路径,这样我们以后修改URL路径的时候别名不改,改动就小了,不然的话改动太大
            url(r'^login/',name=xxxxx),这样我们以后修改url 的时候,这里我们以后修改路径的时候我们直接修改成如下:
            url(r'^login.hhhtml/',name=xxxxx)   反向解析
            
            这样我们在模板语法中标签怎么调用这个变量呢,
            <form action="{% url 'xxxxx' %}" method="post"> 我们就会跳到login.hhhtml/页面了,我们不需要修改其他的东西
            这里我们去找别名是 xxxxx 的URL,然后我们找到的是   login.hhhtml ,然后把login.hhhtml/ 放到action里面,把{% url 'xxxxx' %} 换成  login.hhhtml/
    
    
    
    视图函数
        1 request 对象
            request.GET 
            request.POST
            request.method
            request.path
            request.get_full_path()
    
        2 HttpResponse
            Django 必须相应HttpResponse 对象
            HttpResponse  用来相应字符串
            render           用来响应模板
            redirect      重定向 from django.shortcuts import render,HttpResponse,redirect
            比如说我们登录成功之后给我们重定向到首页
            return redirect('/index/')
    
    
    模板语法  http://www.cnblogs.com/haiyan123/p/7725568.html
        变量渲染{{ }}
            深度查询:
                说到底就是利用句点符来操作
                传入列表的时候,我们html 中变量引用的时候用{{ list.3 }}
                传入字典的时候,html 模板语法中用  {{ dict.key }}
    
            过滤器:
                语法: {{obj|filter__name:param}}
                default 过滤器:
                date 过滤器:{{ value|date:"Y-m-d" }}  
                length 过滤器:{{ value|length }}
                filesizeformat 过滤器:{{ value|filesizeformat }}
                slice 过滤器:{{ value|slice:"2:-1" }}
                truncatechars 过滤器:{{ content|truncatechars:20 }}
    
        标签渲染{ %% }
            for 循环标签  我么可以用到{{ forloop.counter }} 来添加数字,需在for循环内用,我们要是循环字典我们可以利用dict.items
                <ul>
                    {% for book in book_list %}
                        <li>{{ book }}</li>
                    {% endfor %}
                </ul>
    
            if 标签
            {% for foo in score %}
                {% if foo > 100 %}
                    <p> {{ foo }}</p>
                {% endif %}
            {% endfor %}
    
    静态文件的引入:
    # 别名,以后实际用的时候用的是这个别名,STATICFILES_DIRS 是Django用的,STATICFILES_DIRS 和 STATIC_URL 必须都存在,结合使用的
    # 我们在用STATIC_URL别名的时候,Django 会自己去找到他的实际路径,我们在html应用静态文件的时候必须用别名,比如
    # <script src="/static/jquery.js"></script>   这个就是我静态文件应用的格式
    # 下面这个两个是在setting.py 文件里面配置的
    STATIC_URL = '/static/'
    
    # 文件的实际存在目录,必须叫STATICFILES_DIRS
    STATICFILES_DIRS=[os.path.join(BASE_DIR,"static")]
    
    
    
    模板的继承
    我们写一个继承模板base.html
        继承模板里的
        {% block content %}
            继承模板的内容
        {% endblock content %}
    
    
        然后我们在我们的子模板里,首行加上{% extends 'base.html' %}
        然后在html 文件中写入
    
        {% block content %}
            自己的独特内容,这种情况下会覆盖父模板的内容,我么可以加上{{ block.super }},父模板的内容在子模板也出现
        {% endblock content %}
    
    
    
    ORM
    http://www.cnblogs.com/yuanchenqi/articles/8933283.html
    
    有几个问题:
        1、python3 我们用的数据库链接用的是pymysql,所以这里我们在全局的__init__.py 文件或者是工程的__init__.py 文件加上如下两句话
            import pymysql
            pymysql.install_as_MySQLdb()
        2、然后把配置文件setting.py 中的DATABASES 的sqlite3 换成mysql
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME':'orm',# 要连接的数据库,连接前需要创建好
                    'USER':'root',# 连接数据库的用户名
                    'PASSWORD':'abcd1234',# 连接数据库的密码
                    'HOST':'10.10.20.17',# 连接主机,默认本级
                    'PORT': 3306 #  端口 默认3306
                }
            }
        3、models.py 中 创建 表的类    
            class Book(models.Model):
                id = models.AutoField(primary_key=True)
                title = models.CharField(max_length=32)
                state = models.BooleanField()
                pub_date = models.DateField()
                price = models.DecimalField(max_digits=8, decimal_places=2)
                publish = models.CharField(max_length=32)    
    
        4、初始化数据库
            python manage.py makemigrations  (这一步就报错了)
            python manage.py migrate
            在执行初始化数据库的时候遇到
            No changes detected
            然后按照网上的方法,python manage.py makemigrations app01 ,同时在setting.py 里的INSTALLED_APPS添加一行'app01'
            然后再去删除相应的缓存,再执行
            python manage.py makemigrations app01
            python manage.py migrate
  • 相关阅读:
    Heartbeat+Haproxy实现负载均衡高可用
    Heartbeat+Haproxy实现负载均衡高可用
    Heartbeat+Haproxy实现负载均衡高可用
    Heartbeat+Haproxy实现负载均衡高可用
    apache调优技巧之一隐藏apahce版本信息
    apache调优技巧之一隐藏apahce版本信息
    apache调优技巧之一隐藏apahce版本信息
    apache调优技巧之一隐藏apahce版本信息
    用VC实现洪水攻击程序
    WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml
  • 原文地址:https://www.cnblogs.com/smail-bao/p/9529679.html
Copyright © 2011-2022 走看看